Windows 身分識別驗證
在 Windows 身分識別驗證中,IIS 執行身分識別驗證,並將經過身分識別驗證的標記傳遞給 ASP.NET 背景工作處理序。使用 Windows 身分識別驗證的優點是它需要的編碼最少。在將請求傳遞給 ASP.NET 之前,您可能需要使用 Windows 身分識別驗證來類比 IIS 進行驗證的 Windows 使用者帳戶。
Passport 身分識別驗證
Passport 身分識別驗證是 Microsoft 提供的集中式驗證服務,它為成員網站提供單一登入和核心設定檔服務。通常,當您需要跨越多個域的單一登入功能時,將使用 Passport 身分識別驗證。
預設身分識別驗證
當 Web 應用程式不需要任何安全功能時,將使用預設身分識別驗證;此安全提供者需要匿名訪問。在所有的身分識別驗證提供者中,預設身分識別驗證為應用程式提供了最高的效能。當您使用自己的自訂安全模組時,也可以使用此身分識別驗證提供者。
授權
授權是指驗證經身分識別驗證的使用者是否可以訪問請求資源的過程。
ASP.NET 提供以下授權提供者: • FileAuthorization
• UrlAuthorization
FileAuthorization
FileAuthorizationModule 類進行檔案授權,而且在使用 Windows 身分識別驗證時處於活動狀態。FileAuthorizationModule 負責對 Windows 存取控制清單 (ACL) 進行檢查,以確定使用者是否應該擁有存取權限。
UrlAuthorization
UrlAuthorizationModule 類進行統一資源定位器 (URL) 授權,它基於 URI 命名空間來控制授權。URI 命名空間可能與 NTFS 許可權使用的物理檔案夾和檔案路徑存在很大的差異。
UrlAuthorizationModule 實現肯定和否定的授權斷言;即,可以使用該模組有選擇性地允許或拒絕訪問使用者、角色(如 manager、tester 和 administrator)和謂詞(如 GET 和 POST)的 URI 命名空間的任意部分。
角色型安全性
ASP.NET 中角色型安全性類似於 Microsoft COM+ 和 Microsoft Transaction Server (MTS) 所使用的角色型安全性,不過它們之間也存在很大的差異。ASP.NET 中角色型安全性不僅限於 Windows 帳戶和組。例如,如果啟用 Windows 身分識別驗證和類比,使用者的標識就是 Windows 標識 (User.Identity.Name = "Domain\username")。可以檢查特定角色中成員的標識,並相應地限制其存取權限。例如:
Visual C# .NET 代碼
if ( User.IsInRole("BUILTIN\\Administrators"))
Response.Write("You are an Admin");
else if (User.IsInRole("BUILTIN\\Users"))
Response.Write("You are a User");
else
Response.Write("Invalid user");
如果使用的是表單身分識別驗證,則不會為經過身分識別驗證的使用者指派角色;您必須以編程方式執行此任務。若要為經過身分識別驗證的使用者指派角色,請使用身分識別驗證模組(本例中為表單身分識別驗證模組)的 OnAuthenticate 事件建立新的 GenericPrincipal 對象,並為其分配 HttpContext 的 User 屬性。以下代碼對此進行了說明:
Visual C# .NET 代碼
public void Application_AuthenticateRequest(Object s, EventArgs e)
{
if (HttpContext.Current.User != null)
{
if (HttpContext.Current.User.Identity.AuthenticationType == "Forms" )
{
System.Web.Security.FormsIdentity id = HttpContext.Current.User.Identity;
String[] myRoles = new String[3];
myRoles[0]= "managers";
myRoles[1]= "testers";
myRoles[2]= "developers";
HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(id,myRoles);
}
}
}
Visual C# .NET 代碼
if (User.IsInRole("managers"))
Response.Write("You are a Manager");
else if (User.IsInRole("testers"))
Response.Write("You are a Tester");
else if (User.IsInRole("developers"))
Response.Write("You are a Developer");