Authentication 如何让NegotiateStream使用Kerberos?

Authentication 如何让NegotiateStream使用Kerberos?,authentication,negotiate,Authentication,Negotiate,询问之后,我一直在尝试使用NegotiateStream对Java服务器验证Windows客户端。Java似乎没有很好的NTLM库支持,所以我一直在假设我必须使用Kerberos,Java似乎更好地支持Kerberos(通过GSS-API) 问题是NegotiateStream似乎每次都在尝试使用NTLM。文档建议它可以使用这两种方法,但没有具体说明如何选择。我在API中看不到任何选项来控制它选择的机制。有办法吗 我自己有一个服务主体名称,我的客户端代码如下所示: string spn = "&

询问之后,我一直在尝试使用NegotiateStream对Java服务器验证Windows客户端。Java似乎没有很好的NTLM库支持,所以我一直在假设我必须使用Kerberos,Java似乎更好地支持Kerberos(通过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);
string spn=“/”
TcpClient client=新的TcpClient(服务器、端口);
NetworkStream=client.GetStream();
NegotiateStream neg=新的NegotiateStream(stream,true);
neg.AuthenticateTasClient(CredentialCache.DefaultNetworkCredentials,spn);
在服务器端,接收到的第一组字节是22,1,0,0,59,然后是“NTLMSSP”——这是我没有预料到的

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

setspn -A <service-name>/<my-pc-name>.<domain-name> <my-user-name>
setspn-A/。
setspn-L将其成功列出为:

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

我是做错了什么,还是完全误解了这件事

SPN名称的完整语法为
/@DOMAIN
;显然,可以省略域名。但是,如果用户名是
my pc name.domain name
,那么您不应该进一步缩短它-提供SPN,就像
SPN-L
向您列出的那样。

您使用的是什么操作系统?另外,您使用的myServicePrincipalName是什么?这正在Vista64上运行。我对myServicePrincipalName tbh的正确格式有点困惑-我尝试了一些变体!我用以下代码创建了SPN:setspn-A TEST/。我也不确定这是否正确它已经注册了SPN,我可以用列出TEST/的SPN-L来查找它。考虑到这一点,我尝试了“测试/我的电脑名”、“测试/我的用户名”以及这两个域名。显然有很多猜测,我还没有找到很好的文档:(为了完整性,我建议编辑您添加到原始问题中的任何细节。哈,谢谢-这很有效(只有在我使用域名的情况下)具体来说,这个字符串是这样的:TEST/@我没想过尝试这个组合,因为它看起来太多余了,但我想它是有意义的。没有@DOMAIN,它就不能工作,用户名似乎也需要域名。我明天早上会更新这个问题,提到SPN的东西。我这样做对吗NK那么NegotiateStream只有在提供了有效的SPN的情况下才使用Kerberos,如果没有,就悄悄地退回到NTLM?感谢您的帮助:)我猜它试图从KDC获取服务的票证。如果KDC不知道SPN,它将不会发出票证,然后返回到NTLM(它实际上不需要“服务器名称”)。