如何让NegotiateStream使用Kerberos?

时间:2009-09-30 16:31:05

标签: authentication negotiate

在询问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>

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

1 个答案:

答案 0 :(得分:3)

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