【发布时间】: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 字符串尝试了几种不同的格式,但不确定其中的正确格式是什么。我最初使用
创建了 SPNsetspn -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" 以及最后带有域名的两者。显然很多猜测正在进行,我还没有找到很好的文档:( -
为了完整起见,我建议编辑您添加到原始问题中的任何详细信息。