问this question后,我一直在尝试使用NegotiateStream反对Java服务器进行身份验证Windows客户端。看起来Java没有很好的NTLM库支持,所以我一直在努力假设我必须使用Kerberos,而Java似乎支持更好(通过GSS-API)。如何获得NegotiateStream以使用Kerberos?
问题是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>
我做得不对,或者完全误解这个东西? :)
你在使用什么操作系统? – 2009-09-30 19:07:41
另外,你用什么作为myServicePrincipalName? – 2009-09-30 19:15:14
这是在Vista64上运行的。我对myServicePrincipalName tbh的正确格式有些困惑 - 我试过几个变种!我用这个创建了SPN: setspn -A TEST/。 <我的用户名> 我不知道如果这是正确的要么! :s具有注册SPN,我可以看看它与 SPN -L列出 TEST/<我的用户名> 。 鉴于这一点,我正在尝试“TEST/my-pc-name”,“TEST/my-user-name”以及那些带有域名的人。 显然很多猜测正在进行,我还没有找到很好的文档:( –
2009-09-30 19:30:12