5

我想使用 IBM WebSphere 的 .Net WS。

我使用 JAX-WS IBM 实现创建了一个 WS 客户端,它在 IIS 上使用 .Net WS。客户端在 SUSE 上,并且通过 NTLM 和 Windows Server 2003 Active Directory 进行身份验证。

  • 如果客户端在命令行中执行,则实现调用 java.net.Authenticator 以获取凭据并且请求成功。

  • 如果客户端在 RAD 中执行,则不会调用 Authenticator 并且它会失败并返回 401。

  • 如果客户端在 WebSphere 中执行,则不会调用 Authenticator,并且会失败并返回 401。

  • 如果我直接创建一个指向 .Net WS URL 的 HttpConnection,则会调用 Authenticator 并且请求成功。

  • 如果我使用 Axis2(直接,而不是 IBM Axis2 JAX-WS 实现)而不是 JAX-WS IBM 实现,我可以将 Authenticator 对象传递给 Axis2 客户端,并且请求成功。这仅适用于 Windows Server 2003 的 NTLM 协议。当我们迁移到 Windows Server 2008 时,身份验证协议是 NTLMv2(由于 NTLM 的安全问题,每个人都在迁移到 NTLMv2)并且请求失败,因为 HTTP 客户端 3 不支持 NTLMv2。 X 是 Axis2 的依赖项。在一段时间内,他们不会迁移。

如果我使用除 IBM 之外的其他 JAX-WS 实现,我会失去控制台管理和自动注释读取,以及失去来自 IBM 的支持。

问题

我不明白为什么在 RAD 内部它不起作用,是从命令行运行的同一个程序。

您如何使用特定凭据通过 NTLMv2 协议支持使 JAX-WS IBM 实现进行身份验证?(java.net.Authenticator 为您提供了这个,它应该被称为......它没有)

有什么方法可以让 IBM JAX-WS 实现使用另一个 HTTP 客户端而不是标准客户端?

甚至 IBM JVM 实现也提供 NTLM 身份验证(这就是命令行和直接 HttpConnection 执行工作的原因),所以我不明白他们为什么不将它用于 IBM WS 堆栈。

加分

有没有什么好的方法可以提供双向能力来使用 ActiveDirectory 身份验证来消费 WS?

评论

Spring WS 使用支持 NTLMv2 身份验证的 HttpClient 4.X,但我需要一个 JAX-WS 实现,它应该是 IBM 的。IBM JAX-WS 似乎只支持 Basic AUTH。我不明白 Microsoft WS 互操作对 IBM 来说是多么不重要。

参考

身份验证器配置:

http://docs.oracle.com/javase/6/docs/api/java/net/Authenticator.html#setDefault%28java.net.Authenticator%29

https://stackoverflow.com/a/5994706/14811

提前致谢!

4

2 回答 2

2

您正在从 NTLM (1994?) 迁移到 NTLMv2 (1999) 而不是基于 Kerberos 的技术(在 Windows 2000 中引入),因为 NTLMv2 更安全???

在与 Microsoft 的互操作方面,现代系统将在 JAX-WS 客户端和 .NET 服务之间使用 WS-Security Kerberos。这已经过测试。

您正在尝试做的事情(替换进程使用的 Authenticator)适用于独立的 Java 应用程序,但不适合 Java Enterprise 模型,其中 Java 进程托管多个“应用程序”,每个“应用程序”都有自己的“身份验证”要求,不要介意 WebSphere Server 进程之间的内部要求(App Server 到 App Server,Node Agent 到 App Server,App Server 到 LDAP,等等......)

于 2012-09-11T16:01:38.733 回答
2

最后,这就是我所做的。

我使用 RAD 插件创建 JAXB 对象以创建 JAX-WS 客户端。我使用生成的 DTO 作为传递给 Spring WS 库的消息。Spring WS 2.1 带有带来 NTLMv2 支持的 Http Client 4.2。

我创建了一个小库来简化这个过程,但过程的想法是:

  1. 使用 RAD 生成 JAX-WS 客户端
  2. 创建一个实现RAD生成的服务接口的类
  3. 对于每个接口方法:
  4. 3.1 将接口方法的参数注入到JAXB对象中
  5. 3.2将此对象传递给WebServiceTemplate(Spring对象)Web服务调用。
  6. 3.3 将调用响应转换为 JAXB 方法响应对象
  7. 3.4 返回响应对象的内部值

因此,您最终要做的是重用 JAX-WS 客户端的对象生成,将服务方法的参数包装到 Spring WS 进行调用所需的对象中。

NTCredentials对于设置为WebServiceTemplate发件人的NTLM 身份验证。

Axis2 1.7将通过 HttpClient 4.2.X 的更新版本支持 NTLMv2,但还没有发布日期。

看:

  • WebServiceTemplateWS 调用

http://static.springsource.org/spring-ws/sites/2.0/apidocs/org/springframework/ws/client/core/WebServiceTemplate.html#marshalSendAndReceive%28java.lang.Object%29

  • WebServiceTemplate发件人

http://static.springsource.org/spring-ws/sites/2.0/apidocs/org/springframework/ws/client/support/WebServiceAccessor.html#getMessageSenders%28%29

  • NTCredentials

http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/auth/NTCredentials.html


更新:我测试了 Axis 1.7 并且 NTLM 身份验证运行良好。

于 2012-10-11T15:02:01.217 回答