我有一个Java客户端,它使用从JDK 6使用JAX-WS实现编写的SharePoint 2010标准Web服务(sitedata.asmx,permissions.asmx等)。
到目前为止,使用自定义Authenticator
实施和Authenticator.setDefault(...)
方法对NTLM进行身份验证。
在我的只有一台SharePoint服务器的测试环境上运行时,它可以正常工作。我可以使用WireShark查看所有NTLM协商。
但是,如果在拥有多个服务器,硬件负载平衡和多个SharePoint备用访问映射的客户上运行,我会从Web服务调用中获取错误401 Unauthorized。我没有机会使用WireShark来调试该环境。
我从Windows机器(在客户设置上)运行我的客户端,因此根据Java文档,它应该适用于NTLM。此外,我使用SharePoint的默认URL来访问Web服务(而不是负载平衡的URL)。
运行客户端应用程序的计算机不是SharePoint服务器。它具有配置了NTLM的Windows集成身份验证。
此外,由于SharePoint管理策略的原因,我无法访问SharePoint管理中心或对配置(也不是IIS)进行任何更改。
我想问一下是否有人知道这个问题是什么?希望如果有人知道如何解决它?
提前致谢。
修改
重要的是要提到,在这两种环境中都授予了相同的权限级别。
答案 0 :(得分:3)
好吧,最后我有机会在costumer环境中使用WireShark。
首先我注意到他们配置了NTLM v2,但是没关系,因为Java 1.6支持它。
然后我看到,由于启用了Windows集成身份验证,将发送当前记录的用户凭据,而不是代码中配置的凭据。由于已登录的用户没有SharePoint权限,因此我收到了401 Unauthorized。
根据Java documentation,这是正常行为
实际上,如果您作为域用户在Windows计算机上运行,或者您正在已发出kinit命令并获得凭据缓存的Linux或Solaris计算机上运行。 MyAuthenticator类将被完全忽略..... 显示用户名和密码不会被查阅。这就是所谓的单点登录。
我希望有人可以回答this question,因为我认为这正是我所需要的。
最后,我发现使用HTTP会首先尝试使用Windows凭据,如果失败,将使用代码提供的凭据。因此,一切正常。
使用HTTPS时,只会使用Windows凭据,因此我总是获得401 Unauthorized。
不确定导致HTTP和HTTPS之间差异的原因。
答案 1 :(得分:0)
您必须在java中禁用透明认证。您可以通过删除自定义rt.jar或使用反射来修改java类来完成此操作。
tryTransparentNTLMServer和tryTransparentNTLMProxy是HttpURLConnection中的字段,您需要将其设置为可访问,然后在使用反射方法时为false。如果您自己制作rt.jar
,显然只需更改此课程