从Java使用SharePoint Web服务时NTLM失败了吗?

我有一个Java客户端,它使用从JDK 6使用JAX-WS实现编写的SharePoint 2010标准Web服务(sitedata.asmx,permissions.asmx等)。

到目前为止,使用自定义Authenticator实现和Authenticator.setDefault(...)方法对NTLM进行Authenticator Authenticator.setDefault(...)

在仅具有一个SharePoint服务器的测试环境上运行时,它可以正常工作。 我可以使用WireShark查看所有NTLM协商。

但是,如果在具有多个服务器,硬件负载平衡和多个SharePoint备用访问映射的客户上运行,我会从Web服务调用中获取错误401未授权。 我没有机会使用WireShark来调试该环境。

我从Windows机器(在客户设置上)运行我的客户端,因此根据Java文档,它应该适用于NTLM。 此外,我使用SharePoint的默认URL来访问Web服务(而不是负载平衡的URL)。

运行客户端应用程序的计算机不是SharePoint服务器。 它具有配置了NTLM的Windows集成身份validation。

此外,由于SharePoint管理策略,我无法访问SharePoint管理中心或对配置(也不是IIS)进行任何更改。

我想问一下是否有人知道这个问题是什么? 希望如果有人知道如何解决它?

提前致谢。

编辑:

重要的是,在两种环境中都授予了相同的权限级别。

好吧,最后我有机会在costumer环境中使用WireShark。

首先我注意到他们配置了NTLM v2,但是没关系,因为Java 1.6支持它。

然后我看到,由于启用了Windows集成身份validation,将发送当前记录的用户凭据,而不是代码中配置的凭据。 由于已登录的用户对SharePoint没有权限,因此我收到了401 Unauthorized。

根据Java文档,这是正常行为

实际上,如果您作为域用户在Windows计算机上运行,​​或者您正在已发出kinit命令并获得凭据缓存的Linux或Solaris计算机上运行。 MyAuthenticator类将被完全忽略…..它显示没有查询用户名和密码。 这就是所谓的单点登录。

我希望有人可以回答这个问题,因为我认为这正是我所需要的。

最后,我观察到使用HTTP将首先尝试Windows凭据,如果失败,将使用代码提供的凭据。 因此,一切正常。

使用HTTPS时,只会使用Windows凭据,因此我总是获得401 Unauthorized。

不确定导致HTTP和HTTPS之间差异的原因。

您必须在java中禁用透明认证。 您可以通过放入自定义rt.jar或使用reflection来修改java类来完成此操作。

tryTransparentNTLMServer和tryTransparentNTLMProxy是HttpURLConnection中的字段,您需要将其设置为可访问,然后在使用reflection方法时为false。 如果你自己制作自己的rt.jar,显然只需更改此课程