Iis-6

將我的網站移動到不同的伺服器會將身份驗證從 Kerberos 更改為 NTLM

  • May 17, 2011

我有一個為 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。這需要在域控制器上完成。

引用自:https://serverfault.com/questions/270293