如何使用NTLM身份验证从Java客户端调用基于.NET的Web服务

3
我想从Java客户端代码调用基于.NET的Web服务。 我使用wsimport工具生成了JAX-WS存根。
这是在.NET客户端中创建凭据的方式 -
NetworkCredential credential = new NetworkCredential(userName, password, "domain");
client.ClientCredentials.Windows.ClientCredential = credential ;

我们如何在Java客户端中以类似的方式做到这一点?我搜索了很多,发现一些帖子建议进行NTLM身份验证,但我不确定如何实现。
1个回答

1

JAX-WS不支持NTLM身份验证,但您仍有几个替代方案

替代方案1: 创建自己的认证器并将其设置为默认值,它将用于您所有的HTTP通信。 仅在通信是服务器对服务器时使用此替代方案,因为使用多个用户帐户不是最佳选择。 您可以在此处查看如何实现它的代码:http://docs.oracle.com/javase/7/docs/technotes/guides/net/http-auth.html

替代方案2: 另一个选择是使用Axis2,它在后台使用HTTPClient。它将选择最适合您情况的最佳身份验证方法。 axis2 client NTLM authentication

注意: Axis2与某些版本的NTLM存在问题,一些人建议转移到CFX CXF SOAP Client with NTLM to SharePoint

这些替代方案需要您在代码中包含新的库,希望能对您有所帮助。


1
感谢@Pablo的回复。我尝试了第二种替代方案,使用以下代码: ServiceClass serviceClass = new ServiceClass(); PortInterface client = serviceClass.getPort(PortInterface.class);BindingProvider bindingProvider = (BindingProvider) client; bindingProvider.getRequestContext().put("use.async.http.conduit", Boolean.TRUE); Credentials creds = new NTCredentials(USERNAME, PASSWORD, "", DOMAIN); bindingProvider.getRequestContext().put(Credentials.class.getName(), creds);但是它抛出了“PolicyException: None of the policy alternatives can be satisfied”的异常。 - Savita Chaurasiya Rohra
尝试了您链接中的其他代码片段,但无法继续。您是否有其他相同的实现方式?此外,wsdl使用以下标记进行安全性设置,我仍然需要遵循NTLM身份验证,对吗?- <http:NegotiateAuthentication xmlns:http =“http://schemas.microsoft.com/ws/06/2004/policy/http”/> - Savita Chaurasiya Rohra
你收到什么错误信息了吗?你是否使用CFX进行过测试? - Pablo Melchi
使用CFX时,我遇到了这个异常 - org.apache.cxf.ws.policy.PolicyException: 无法满足任何策略替代方案。 - Savita Chaurasiya Rohra
我稍微修改了代码但仍然出现了相同的 PolicyException。我在这里发布了代码片段 - http://stackoverflow.com/questions/36630212/cxf-throws-none-of-the-policy-alternatives-can-be-satisfied - Savita Chaurasiya Rohra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接