2011-05-05 540 views
2

我正在编写需要从IIS托管的Web服务中获取数据的Java 1.5+客户端。我在Eclipse中创建了一个新的Web服务客户端,并在生成客户端代理时使用Java代理客户端类型和Apache Axis2 Web服务运行时。 Web服务本身在Windows 2003上运行,并且安全性设置为仅使用Windows集成身份验证。我在网上发现了很多文章,展示了如何从Java客户端成功连接到这个IIS服务,但是我看到的所有东西似乎都要求我将用户名和密码放在我的Java客户端代码中。Java客户端调用Windows集成身份验证Web服务

我的Java客户端将运行在IIS服务所在的同一Active Directory网络上的Windows计算机上(即,我每天登录的帐户都可以访问该服务)。我想让我的Java客户端在登录用户的上下文中运行,而不需要在代码中输入我的登录凭据。这里是我当前的代码,它的工作原理,但我需要在代码中把一个用户名和密码:

final NTCredentials nt = new NTCredentials("my_username", "my_password", "", "my_domain"); 
     final CredentialsProvider myCredentialsProvider = new CredentialsProvider() { 
      public Credentials getCredentials(final AuthScheme scheme, final String host, int port, boolean proxy) throws CredentialsNotAvailableException { 
       return nt; 
      } 
     }; 

     DefaultHttpParams.getDefaultParams().setParameter("http.authentication.credential-provider", myCredentialsProvider); 

但我真的不希望有把用户名和密码的代码 - 我希望它使用正在运行Java客户端的已登录Windows用户的凭据运行。

我应该使用哪些代码,以便与登录用户的凭证连接,而无需指定用户名和密码?这可能吗?

+0

肖恩 - Axis2的不(我相信)直接包括HTTP客户端代码。自从我使用Axis以来,这已经有一段时间了,但此时它需要Apache httpclient 3。您能确认您是否在使用Axis2和HTTPClient 3? – 2011-05-11 17:35:48

+0

我还没有做任何具体的查看或使用HTTPClient3。我所做的是1)右击该项目,并创建一个新的Web服务客户端: 一个。 \t右键 - 新建 - 其他 - Web服务 - Web服务客户端 湾\t点击下一步 c。 \t指向Web服务的WSDL d。 \t将仪表设置到最低级别(开发客户端) e。 \t单击Web服务运行时的配置链接 - 选择Apache Axis2 f。 \t完成 2)使用生成的代理类来使用服务 – Shawn 2011-05-19 22:02:23

回答

-2

您所描述的功能不是OS的功能,而是Internet Explorer的功能。您应该可以更好地了解“Windows身份验证”的实际工作原理(又名NLTM HTTP身份验证)。 JCIFS正在移除向servlet容器提供此功能的ServletFilter。但是,他们的basic description of how NTLM HTTP Authentication works是有帮助的。

一旦您了解了身份验证的工作方式,您就可以实现某种Axis插件来提供该功能。

2

我已经使用了Axis已经有几年了 - 然后,Axis依赖于Apache commons httpclient 3.从阅读一些邮件列表,它看起来像this is still the case。 (如果没有,最后一段应该提供一些值得欢迎的帮助。)

Apache commons httpclient 3不支持通过HTTP进行“集成Windows身份验证”(即与Kerberos的协商身份验证机制,又名“SPNEGO”。)实际上,它不支持NTLMv2,仅支持NTLMv1,这意味着您将无法对许多需要NTLMv2而无需修改的IIS服务器进行身份验证。

尽管无可厚非,但我认为最好的选择是创建一个新的AuthScheme,它调用Windows SSPI库进行身份验证。不幸的是,你需要使用JNI来做到这一点。幸运的是,AuthScheme已准备好执行基于会话的质询 - 响应身份验证模式(SPNEGO与已支持的NTLM类似)。基本上,您将base64编码输入和输出字节缓冲区为本地InitializeSecurityContext调用。我承认编写这个程序很繁琐,但我可以确认它确实可以让您对IIS服务器执行集成Windows身份验证。

(不幸的是,如果你需要你的客户是跨平台的,你还需要编写Unix上的必要GSSAPI代码。)

另一种方法是编写使用Java的Kerberos库新AuthScheme (JAAS)。我不太了解这些,说实话,因为它需要从系统kerberos库中单独配置。也就是说,在Windows上,您必须编写一些指向您的Active Directory服务器的Kerberos配置文件。在我看来,这并不是真正的“整合”。如果您将软件分发给客户,而且他们希望“只是工作”,这可能不适合您。另外,虽然JAAS已经有一段时间了,我相信,早期版本缺乏的是被要求谈谈对Active Directory一些身份验证机制,所以我想你会需要一个Java 6的运行时间。现在

,如果我错了,你可以使用Axis2的新的Apache HTTP组件HttpClient的4,那么你就好得多。 httpclient 4使用Java的Kerberos库支持SPNEGO,这意味着一旦您不必编写自己的AuthScheme,只需配置C:\ WINDOWS \ KRB5.INI,并且您应该能够利用集成Windows身份验证。但是,为了避免必须配置JAAS的手动步骤,您仍然需要调用本地SSPI方法。

相关问题