本教程闡釋在 ASP.NET 2.0 版中,IIS 集成 Windows 身份驗證以及 ASP.NET Windows 身份驗證的工作機制。同時,闡釋 NTLM 和 Kerberos 身份驗證的工作機制。此外,本教程還闡釋 WindowsAuthenticationModule 類如何構造 WindowsPrincipal 和 WindowsIdentity 對象,然後將這些對象附加到當前的 ASP.NET Web 請求以表示經過身份驗證的用戶。
概述
身份驗證是一個驗證客戶端身份的過程,通常采用指定的第三方授權方式。客戶端可能是最終用戶、計算機、應用程序或服務。客戶端的標識稱為安全原則。為了使用服務器應用程序進行驗證,客戶端提供某種形式的憑據來允許服務器驗證客戶端的標識。確認了客戶端的標識後,應用程序可以授予執行操作和訪問資源的原則。
如果應用程序使用 Active Directory 用戶存儲,則應該使用集成 Windows 身份驗證。對 ASP.NET 應用程序使用集成 Windows 身份驗證時,最好的方法是使用 ASP.NET 的 Windows 身份驗證提供程序附帶的 Internet 信息服務 (IIS) 身份驗證方法。使用該方法,將自動創建一個 WindowsPrincipal 對象(封裝一個 WindowsIdentity 對象)來表示經過身份驗證的用戶。您無需編寫任何身份驗證特定的代碼。
ASP.NET 還支持使用 Windows 身份驗證的自定義解決方案(避開了 IIS 身份驗證)。例如,可以編寫一個根據 Active Directory 檢查用戶憑據的自定義 ISAPI 篩選器。使用該方法,必須手動創建一個 WindowsPrincipal 對象。
ASP.NET 身份驗證
IIS 向 ASP.NET 傳遞代表經過身份驗證的用戶或匿名用戶帳戶的令牌。該令牌在一個包含在 IPrincipal 對象中的 IIdentity 對象中維護,IPrincipal 對象進而附加到當前 Web 請求線程。可以通過 HttpContext.User 屬性訪問 IPrincipal 和 IIdentity 對象。這些對象和該屬性由身份驗證模塊設置,這些模塊作為 HTTP 模塊實現並作為 ASP.NET 管道的一個標准部分進行調用,如圖 3 所示。
圖 3. ASP.NET 管道
ASP.NET 管道模型包含一個 HttpApplication 對象、多個 HTTP 模塊對象,以及一個 HTTP 處理程序對象及其相關的工廠對象。HttpRuntime 對象用於處理序列的開頭。在整個請求生命周期中,HttpContext 對象用於傳遞有關請求和響應的詳細信息。
有關 ASP.NET 請求生命周期的詳細信息,請參閱"ASP.NET Life Cycle",網址是 http://msdn2.microsoft.com/library/ms227435(en-US,VS.80).aspx。
身份驗證模塊
ASP.NET 2.0 在計算機級別的 Web.config 文件中定義一組 HTTP 模塊。其中包括大量身份驗證模塊,如下所示:
以下是引用片段:
<httpModules>
<add name="WindowsAuthentication"
type="System.Web.Security.WindowsAuthenticationModule" />
<add name="FormsAuthentication"
type="System.Web.Security.FormsAuthenticationModule" />
<add name="PassportAuthentication"
type="System.Web.Security.PassportAuthenticationModule" />
</httpModules>
只加載一個身份驗證模塊,這取決於該配置文件的 authentication 元素中指定了哪種身份驗證模式。該身份驗證模塊創建一個 IPrincipal 對象並將它存儲在 HttpContext.User 屬性中。這是很關鍵的,因為其他授權模塊使用該 IPrincipal 對象作出授權決定。
當 IIS 中啟用匿名訪問且 authentication 元素的 mode 屬性設置為 none 時,有一個特殊模塊將默認的匿名原則添加到 HttpContext.User 屬性中。因此,在進行身份驗證之後,HttpContext.User 絕不是一個空引用(在 Visual Basic 中為 Nothing)。
WindowsAuthenticationModule
如果 Web.config 文件包含以下元素,則激活 WindowsAuthenticationModule 類。
以下是引用片段:
<authentication mode="Windows" />
WindowsAuthenticationModule 類負責創建 WindowsPrincipal 和 WindowsIdentity 對象來表示經過身份驗證的用戶,並且負責將這些對象附加到當前 Web 請求。
對於 Windows 身份驗證,遵循以下步驟:
•WindowsAuthenticationModule 使用從 IIS 傳遞到 ASP.NET 的 Windows 訪問令牌創建一個 WindowsPrincipal 對象。該令牌包裝在 HttpContext 類的 WorkerRequest 屬性中。引發 AuthenticateRequest 事件時,WindowsAuthenticationModule 從 HttpContext 類檢索該令牌並創建 WindowsPrincipal 對象。HttpContext.User 用該 WindowsPrincipal 對象進行設置,它表示所有經過身份驗證的模塊和 ASP.NET 頁的經過身份驗證的用戶的安全上下文。
•WindowsAuthenticationModule 類使用 P/Invoke 調用 Win32 函數並獲得該用戶所屬的 Windows 組的列表。這些組用於填充 WindowsPrincipal 角色列表。
•WindowsAuthenticationModule 類將 WindowsPrincipal 對象存儲在 HttpContext.User 屬性中。隨後,授權模塊用它對經過身份驗證的用戶授權。
注:DefaultAuthenticationModule 類(也是 ASP.NET 管道的一部分)將 Thread.CurrentPrincipal 屬性設置為與 HttpContext.User 屬性相同的值。它在處理 AuthenticateRequest 事件之後進行此操作。