在询问了this question之后,我一直在尝试使用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);
在服务器端,收到的第一组字节是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:56:37
SPN名称的完整语法是<service>/<user>@DOMAIN
;显然,可以省略域名。但是,如果用户名是SPN,那么您不应该进一步缩短它-提供与spn -L
列出的完全相同的my-pc-name.domain-name
。
https://stackoverflow.com/questions/1499267
复制相似问题