問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