使用Java实现NTLM静默登录

时间:2013-02-15 16:53:13

标签: ntlmv2

希望有人可以使用NTLMv2调用应用程序(返回XML)的简单URL来弥补我的天真。

我已经阅读了几乎所有的问题和页面,但我留下了一个压倒一切的好奇心。我目前正在使用HTTPClient(尽管可以更改)以及最新的JDK(在撰写本文时)。

这是一个看似调用JCIFS库的示例页面: http://hc.apache.org/httpcomponents-client-ga/ntlm.html

所有看起来都很好,尽管令人困惑,但这凸显了我所看到的许多例子引发的问题 - 提供NTCredentials的问题。

对我而言,NTLM的重点在于我无需提供凭据。目标应用程序设置为使用NTLM,所以当然应该使用当前登录用户的用户信用?我为什么要自己提供任何凭证?

如果我遗漏了一些明显的东西,请道歉。我只需要使用Java最基本的NTLM SSO。我不在乎什么版本的东西,我能用最新的东西。

抱着希望!谢谢你的阅读。

1 个答案:

答案 0 :(得分:0)

不幸的是,有一种方法可以在纯Java环境中进行单点登录。

NTLM不是直接单点登录的解决方案。 NTLM是一种质询/响应身份验证机制,它需要用户密码的NTLM哈希值。 Windows机器能够使用NTLM提供单点登录,因为NTLM哈希是持久的。然后,他们可以根据持久化哈希计算对挑战的响应。

无法访问该哈希值(据我所知,您不能简单地请求它),您需要自己计算它。这需要拥有用户的密码。

同样,您可以使用SPNEGO身份验证对Kerberos票证进行单点登录(如果远程系统设置为支持它),但遗憾的是Java重新实现了Kerberos,而不是使用系统Kerberos库。因此,即使您已经登录到域,也需要获取另一个Java的Kerberos票证。这意味着再次输入您的密码。

避免输入密码进行身份验证的唯一现实方法是调用本机方法。在Windows上,这是SSPI,它将使您能够响应NTLM或SPNEGO挑战。在非Windows平台上,这由非常相似的GSSAPI处理,并提供响应SPNEGO(Kerberos)的能力。