【问题标题】:How to get NegotiateStream to use Kerberos?如何让 NegotiateStream 使用 Kerberos?
【发布时间】:2009-09-30 16:31:04
【问题描述】:

在询问this question 之后,我一直在尝试使用 NegotiateStream 针对 Java 服务器对 Windows 客户端进行身份验证。似乎 Java 没有很好的 NTLM 库支持,所以我一直在假设我必须使用 Kerberos,Java 似乎支持得更好(通过 GSS-API)。

问题在于 NegotiateStream 似乎每次都在尝试使用 NTLM。文档建议它可以使用任何一种,但没有指定它是如何选择的。我在 API 中看不到任何选项来控制它选择的机制。有什么办法吗?

我有一个服务主体名称,我的客户端代码如下所示:

string spn = "<service-name>/<my-pc-name>"
TcpClient client = new TcpClient(server, port);
NetworkStream stream = client.GetStream();
NegotiateStream neg = new NegotiateStream(stream, true);
neg.AuthenticateAsClient(CredentialCache.DefaultNetworkCredentials, spn);

在服务器端,接收到的第一组字节是 22,1,0,0,59,然后是“NTLMSSP”——这是我没想到的。

我为 SPN 字符串尝试了几种不同的格式,但不确定其中的正确格式是什么。我最初使用

创建了 SPN
setspn -A <service-name>/<my-pc-name>.<domain-name> <my-user-name>

setspn -L 成功将其列为:

TEST/<my-pc-name>.<domain-name>

我是做错了什么,还是完全误解了这些东西? :)

【问题讨论】:

  • 您使用的是什么操作系统?
  • 另外,您使用什么作为 myServicePrincipalName?
  • 目前在 Vista64 上运行。我对 myServicePrincipalName tbh 的正确格式有点困惑 - 我尝试了一些变体!我用这个创建了 SPN: setspn -A TEST/. 我也不确定这是否正确! :S 它已经注册了 SPN,我可以使用 spn -L 来查找它,它列出了 TEST/. 鉴于此,我正在尝试“TEST /my-pc-name"、"TEST/my-user-name" 以及最后带有域名的两者。显然很多猜测正在进行,我还没有找到很好的文档:(
  • 为了完整起见,我建议编辑您添加到原始问题中的任何详细信息。

标签: authentication negotiate


【解决方案1】:

SPN 名称的完整语法是&lt;service&gt;/&lt;user&gt;@DOMAIN;显然,可以省略域名。但是,如果用户名是 my-pc-name.domain-name,那么您不应进一步缩短它 - 提供与 spn -L 完全相同的 SPN。

【讨论】:

  • 哈,谢谢 - 有效(仅当我使用域名时)。所以具体来说,有效的字符串如下所示: TEST/.@ 我没想过尝试这种组合,因为它看起来很多余,但我猜这说得通。如果没有@DOMAIN,它就无法工作,并且用户名似乎也需要其中的域名。明天早上我会更新问题以提及 SPN 的内容。我是否正确地认为 NegotiateStream 仅在给出有效 SPN 时才使用 Kerberos,如果没有则悄悄地退回到 NTLM?感谢您的所有帮助:)
  • 我的猜测是它试图从 KDC 获取服务票证。如果 KDC 不知道 SPN,它就不会发出票证,然后它会退回到 NTLM(它实际上不需要“服务器名称”)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 2010-11-06
  • 1970-01-01
  • 2013-01-02
  • 2019-11-24
相关资源
最近更新 更多