將我的網站移動到不同的伺服器會將身份驗證從 Kerberos 更改為 NTLM
我有一個為 Windows 身份驗證配置的 web 服務。呼叫 WS 的客戶端程式碼將憑證傳遞給 WS,如下所示:
myWebService.Credentials = System.Net.CredentialCache.DefaultCredentials;
(我的理解是這代表了登錄使用者的使用者名密碼域)。
我正在測試配置問題並對如何確保設置 Kerberos 感到困惑。
詳情如下:
我在同一個 IIS 伺服器上有 2 個虛擬目錄(一個是帶有 .aspx 頁面的“客戶端”),另一個是“伺服器”(它託管客戶端呼叫的 Web 服務)。
我的客戶通過此程式碼顯示有關連接使用者的關鍵資訊:
private string GetUserInfo() { System.Security.Principal.WindowsIdentity UserIdentityInfo; StringBuilder msg = new StringBuilder("User Name: "); UserIdentityInfo = System.Security.Principal.WindowsIdentity.GetCurrent(); msg.Append(UserIdentityInfo.Name); msg.Append(Environment.NewLine); msg.Append(" Token: "); msg.Append(UserIdentityInfo.Token.ToString()); msg.Append(Environment.NewLine); msg.Append(" Authenticated: "); msg.Append(UserIdentityInfo.AuthenticationType); msg.Append(Environment.NewLine); msg.Append(" System: "); msg.Append(UserIdentityInfo.IsSystem); msg.Append(Environment.NewLine); msg.Append(" Guest: "); msg.Append(UserIdentityInfo.IsGuest); msg.Append(Environment.NewLine); msg.Append(" Anonymous: "); msg.Append(UserIdentityInfo.IsAnonymous); msg.Append(Environment.NewLine); return msg.ToString(); }
當 webclient 和被呼叫的 webservice 在同一台伺服器上(例如 SERVER1)時,身份驗證類型為**Kerberos 。**實際執行也可以正常工作。
當呼叫相同的 webclient 程式碼時,身份驗證類型更改為**NTLM ,但它現在駐留在 SERVER2 上。**被呼叫的 web 服務仍然駐留在原始伺服器 (SERVER1) 上。實際執行失敗,因為憑據不正確。
SERVER1 和 SERVER2 位於同一個區域網路(同一個域)上,並且我用於測試上述每個場景的域帳戶是相同的(我在每台機器上的管理員組中)。
我該如何配置它,使 KERBEROS 成為身份驗證類型 - 也就是說,當“我”從瀏覽器呼叫 SERVER2 上的這個客戶端時?
你所擁有的是一個經典的雙跳情況。以下文章中的圖形幾乎是您的確切情況:
http://blogs.technet.com/b/askds/archive/2008/06/13/understanding-kerberos-double-hop.aspx
當您的“客戶端”和“服務”都在 Server1 上時,只有一個“單跳”來驗證使用者。當您將 Server2 引入組合時,您現在擁有了授權身份驗證的雙躍點。
由於您將應用程序池作為域帳戶執行,因此您需要設置服務主體名稱 (SPN) 以防止雙跳。上面的文章中提到了資源。在這篇文章中也提到了它:
http://msdn.microsoft.com/en-us/library/ff649309.aspx
需要為特定的使用者帳戶、服務和主機名創建 SPN。這需要在域控制器上完成。