问完这个问题后,我一直在尝试使用 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 字符串尝试了几种不同的格式,但不确定正确的格式是什么。我最初用
setspn -A <service-name>/<my-pc-name>.<domain-name> <my-user-name>
setspn -L 成功将其列为:
TEST/<my-pc-name>.<domain-name>
我做错了什么,还是完全误解了这些东西?:)