也談ASP.NET 中的身份驗證
一、配置安全身份驗證模式
在Web.config 文件中,通過 <authentication> 節可以配置 ASP.NET 使用的安全身份驗證模式,以標識傳入的用戶。
<authentication mode="[Windows|Forms|Passport|None]"> <forms>...</forms> <passport/> </authentication>
<authentication> 節的mode 為必選的屬性。指定應用程序的默認身份驗證模式。此屬性可以為下列值之一:
Windows :將 Windows 驗證指定為默認的身份驗證模式。將它與以下任意形式的 Microsoft Internet 信息服務 (IIS) 身份驗證結合起來使用:基本、摘要、集成 Windows 身份驗證 (NTLM/Kerberos) 或證書。在這種情況下,您的應用程序將身份驗證責任委托給基礎 IIS。
Forms :將 ASP.NET 基于窗體的身份驗證指定為默認身份驗證模式。
Passport :將 Microsoft Passport Network 身份驗證指定為默認身份驗證模式。
None :不指定任何身份驗證。您的應用程序僅期待匿名用戶,否則它將提供自己的身份驗證。默認值為 Windows。
二、設置基于窗體的身份驗證
當ASP.NET 基于窗體的身份驗證<authentication mode="Forms"> 時,其<forms> 子節點為窗體自定義身份驗證配置。
示例如下:
<authentication mode="Forms"> <forms cookieless="UseDeviceProfile" defaultUrl="Default.aspx" loginUrl="Login.aspx" name="cnblogs" slidingExpiration="false" timeout="15" /> </authentication>
cookieless :定義是否使用 Cookie 以及 Cookie 的行為。默認值為 UseDeviceProfile ;
defaultUrl :定義在身份驗證之后用于重定向的默認 URL。默認值為 default.aspx ;
loginUrl :指定如果找不到任何有效的身份驗證 Cookie,將請求重定向到的用于登錄的 URL。默認值為 login.aspx ;
name :指定要用于身份驗證的 HTTP Cookie。默認值為 ".ASPXAUTH" ;如果正在一臺服務器上運行多個應用程序,并且每個應用程序都需要唯一的Cookie,則必須在每個應用程序的 Web.config 文件中配置 Cookie 名稱
slidingExpiration :指定是否啟用彈性過期時間。True 指定啟用彈性過期時間。在單個會話期間,身份驗證 Cookie 被刷新,并且每個后續請求的到期時間被重置。在 .NET Framework 1.x 版中,默認值為 True。 False 指定不啟用可調過期,并指定 Cookie 在最初發出之后,經過一段設定的時間間隔后過期。在 .NET Framework 2.0 版中,默認值為 False。
timeout :指定 Cookie 過期前逝去的時間(以整數分鐘為單位)。如果 SlidingExpiration 屬性為 true,則 timeout 屬性是滑動值,會在接收到上一個請求之后的指定時間(以分鐘為單位)后過期。為防止危及性能并避免向開啟 Cookie 警告的用戶發出多個瀏覽器警告,當指定的時間逝去大半時將更新 Cookie。這可能導致精確性受損。持久性 Cookie 不超時。默認值為 "30"(30 分鐘)。
三、配置 Web 應用程序的授權
接下來添加<authorization> 節配置 Web 應用程序的授權,以控制客戶端對 URL 資源的訪問。
<authorization> <allow ...="" /> <deny ...="" /> </authorization>
<authorization> 授權:順序是先寫allow,再寫deny,不然就會出現問題。
allow :向授權規則映射添加一個規則,該規則允許對資源進行訪問。
deny :向授權規則映射添加一條拒絕對資源的訪問的授權規則。
示例如下:
<authorization> <deny users="?" /> </authorization>
<deny users="?" /> 表示拒絕訪問的用戶。問號 (?) 表示拒絕匿名用戶;星號 (*) 表示拒絕所有用戶訪問。若添加用戶名列表使用逗號分隔。
設置完畢后,Web.config 文件的整體配置如下:
<!-- 通過 <authentication> 節可以配置 ASP.NET 使用的 安全身份驗證模式,以標識傳入的用戶。 --> <authentication mode="Forms"> <forms cookieless="UseDeviceProfile" defaultUrl="Default.aspx" loginUrl="Login.aspx" name="newerSize" slidingExpiration="false" timeout="15" /> </authentication> <!-- <authorization>授權:順序是先寫allow,再寫deny,不然就會出現問題。 --> <authorization> <deny users="?"/> </authorization>
四、在頁面程序中使用Forms 身份驗證
在頁面程序的后臺代碼中,我們使用FormsAuthentication 類為Web 應用程序管理 Forms 身份驗證服務。在登錄頁面Login.aspx 中,代碼如下:
//登錄 protected void btnLogin_Click(object sender, EventArgs e) { string name = txtName.Text.Trim(); string pwd = txtPwd.Text.Trim(); if ("Andy" == name && "123" == pwd) { //方式一 //FormsAuthentication.RedirectFromLoginPage(name, true); /*參數二為true:表示創建持久 Cookie(跨瀏覽器會話保存的 Cookie)*/ //方式二 //為用戶創建一個票證,并將其放入cookie或者url中(具體看你怎么設置票證的保存方式) FormsAuthentication.SetAuthCookie(name, true); Response.Redirect("Default.aspx"); } else { Response.Write("<script>alert('登錄失敗!')</script>"); } } //注銷 protected void btnExit_Click(object sender, EventArgs e) { //從瀏覽器刪除 Forms 身份驗證票證。 FormsAuthentication.SignOut(); }
登錄成功后,跳轉到的默認頁面Default.aspx 中,代碼如下:
protected void Page_Load(object sender, EventArgs e) { //User:獲取有關發出頁請求的用戶的信息。 string username = User.Identity.Name; Label1.Text = username + ":登錄成功!"; }
User.Identity.Name 用于獲得Cookie 中的用戶名。