【问题标题】:How to invoke the .Net Based webservice from a java client with NTLM authentication如何从具有 NTLM 身份验证的 Java 客户端调用基于 .Net 的 Web 服务
【发布时间】:2016-04-12 20:45:18
【问题描述】:

我想从 java 客户端代码调用基于 .NET 的 web 服务。我使用 wsimport 工具生成了 JAX-WS 存根。

这是在 .NET 客户端中创建凭据的方式-

NetworkCredential credential = new NetworkCredential(userName, password, "domain");
client.ClientCredentials.Windows.ClientCredential = credential ;

我们如何在 Java 客户端中进行类似的操作?我搜索了很多,发现一些帖子建议进行 NTLM 身份验证,但我不知道该怎么做。

【问题讨论】:

    标签: java web-services jax-ws ntlm


    【解决方案1】:

    JAX-WS 不支持 NTLM 身份验证,但您仍有多种选择

    备选方案 1: 创建您自己的身份验证器并将其设置为默认值,它将用于您所有的 HTTP 通信。 仅当通信是 server2server 时才使用此替代方案,因为使用多个多个用户帐户不是最佳选择。 你可以在这里看到如何实现它的代码: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

    这些替代方法要求您在代码中包含新库,希望对您有所帮助

    【讨论】:

    • 感谢@Pablo 的回复。我用下面的代码尝试了第二种选择 - ServiceClass serviceClass = new ServiceClass(); PortInterface 客户端 = serviceClass.getPort(PortInterface.class); BindingProvider bindingProvider = (BindingProvider) 客户端; bindingProvider.getRequestContext().put("use.async.http.conduit", Boolean.TRUE); Credentials creds = new NTCredentials(USERNAME, PASSWORD, "", DOMAIN); bindingProvider.getRequestContext().put(Credentials.class.getName(), creds);但它会抛出 - PolicyException:没有一个政策替代品可以满足”。
    • 从您的链接中也尝试了其他代码 sn-ps,但无法继续。你有任何其他相同的实现。 wsdl 也使用下面的标签来保证安全,我仍然需要遵循 NTLM 身份验证,对吗? - schemas.microsoft.com/ws/06/2004/policy/http">
    • 您收到的错误是什么?你用 CFX 测试过吗?
    • 使用 CFX - 我遇到了这个异常 - org.apache.cxf.ws.policy.PolicyException: 没有一个政策替代品可以满足。
    • 我对代码做了一点改动,但仍然是相同的 PolicyException。我在这里发布了代码 sn-p - stackoverflow.com/questions/36630212/…
    猜你喜欢
    • 2017-02-16
    • 1970-01-01
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    相关资源
    最近更新 更多