2

希望有人能纠正我在使用 NTLMv2 调用简单 URL 到应用程序(返回 XML)时的天真。

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

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

一切看起来都不错,尽管令人困惑,但这突出了我看到的许多示例提出的问题 - 提供 NTCredentials 的问题。

对我而言,NTLM 的全部意义在于我不必提供凭据。目标应用程序设置为使用 NTLM,因此肯定应该使用当前登录用户的用户凭据吗?为什么我要自己提供任何凭据?

抱歉,如果我在这里遗漏了一些明显的东西。我只需要最基础的可能使用 Java 的 NTLM SSO。我不在乎什么版本,我可以使用最新的任何东西。

抱着希望!谢谢阅读。

4

1 回答 1

0

不幸的是,有办法在纯 Java 环境中进行单点登录。

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

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

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

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

于 2013-02-15T18:04:22.783 回答