我有一个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集成身份验证。
另外,由于SharePoint管理策略的原因,我无法访问SharePoint管理中心或对配置(或IIS)进行任何更改。
我想问问是否有人知道这个问题可能是什么?希望有人知道如何解决吗?
提前致谢。
编辑:
值得一提的是,两种环境都授予了相同的权限级别。
好吧,终于有机会在客户环境中使用WireShark。
首先,我注意到他们已经配置了NTLM v2,但这没关系,因为Java 1.6支持它。
然后我看到,由于启用了Windows集成身份验证,因此将发送当前记录的用户凭据,而不是代码中配置的凭据。由于登录的用户对SharePoint没有权限,因此我收到401未经授权。
根据Java文档,这是正常现象
实际上,如果您以域用户身份在Windows机器上运行,或者您已经在Linux或Solaris机器上运行,该机器已经发出了kinit命令并获得了凭据缓存。MyAuthenticator类将被完全忽略......,表明未查询用户名和密码。这就是所谓的单点登录。
最后,我观察到使用HTTP首先将尝试Windows凭据,并且在失败时将使用代码提供的凭据。因此,一切正常。
使用HTTPS时,将仅使用Windows凭据,因此我总是获得401 Unauthorized。
不知道是什么原因导致HTTP和HTTPS之间的差异。