淺析ASP.NET Forms驗(yàn)證
ASP.NET Forms驗(yàn)證,下面看一下授權(quán)的詳細(xì)過程:
1). 一旦一個(gè)用戶訪問這個(gè)網(wǎng)站,就行登錄確認(rèn)了身份,身份驗(yàn)證票的cookie也寫到了客戶端。之后,這個(gè)用戶再次申請這個(gè)web的頁面,身份驗(yàn)證票的cookie就會(huì)發(fā)送到服務(wù)端。在服務(wù)端,ASP.NET為每一個(gè)http請求都分配一個(gè)HttpApplication對象來處理這個(gè)請求,在 HttpApplication.AuthenticateRequest事件后,安全模塊已建立用戶標(biāo)識(shí),就是此用戶的身份在web端已經(jīng)建立起來,這個(gè)身份完全是由客戶端發(fā)送回來的身份驗(yàn)證票的cookie建立的。
2). 用戶身份在HttpContext.User 屬性中,在頁面中可以通過Page.Context 來獲取同這個(gè)頁面相關(guān)的HttpContext對象。對于Forms驗(yàn)證,HttpContext.User屬性是一個(gè)GenericPrincipal類型的對象,GenericPrincipal只有一個(gè)公開的屬性Identity,有個(gè)私有的m_role屬性,是string[]類型,存放此用戶是屬于哪些role的數(shù)組,還有一個(gè)公開的方法IsInRole(string role),來判斷此用戶是否屬于某個(gè)角色。
由于身份驗(yàn)證票的cookie中根本沒有提供role屬性,就是說Forms身份驗(yàn)證票沒有提供此用戶的role信息,所以,對于Forms驗(yàn)證,在服務(wù)端得到的GenericPrincipal 用戶對象的m_role屬性永遠(yuǎn)是空的。
3). GenericPrincipal. Identity 屬性是一個(gè)FormsIdentity類型的對象,這個(gè)對象有個(gè)Name屬性,就是此用戶的標(biāo)示,訪問授權(quán)就是將此屬性做為user來進(jìn)行授權(quán)驗(yàn)證的。 FormsIdentity還有一個(gè)屬性,就是Ticket屬性,此屬性是身份驗(yàn)證票FormsAuthenticationTicket類型,就是之前服務(wù)器寫到客戶端的身份驗(yàn)證票。
服務(wù)器在獲取到身份驗(yàn)證票FormsAuthenticationTicket對象后,查看這個(gè)身份驗(yàn)證票是不是非持久的身份驗(yàn)證,是的話要根據(jù)web.config中timeout屬性設(shè)置的有效期來更新這個(gè)身份驗(yàn)證票的cookie(為避免危及性能,在經(jīng)過了超過一半的指定時(shí)間后更新該 Cookie。這可能導(dǎo)致精確性上的損失。持久性 Cookie 不超時(shí)。)
4). 在HttpApplication.ResolveRequestCache事件之前,ASP.NET開始取得用戶請求的頁面,建立HttpHandler控制點(diǎn)。這就意味著,在HttpApplication.ResolveRequestCache事件要對用戶訪問權(quán)限就行驗(yàn)證,看此用戶或角色是否有權(quán)限訪問這個(gè)頁面,之后在這個(gè)請求的生命周期內(nèi)再改變此用戶的身份或角色就沒有意義了。
以上是ASP.NET Forms驗(yàn)證的全過程,可以看出,這個(gè)ASP.NET Forms驗(yàn)證是基于用戶的,沒有為角色的驗(yàn)證提供直接支持。身份驗(yàn)證票FormsAuthenticationTicket 中的Name屬性是用戶標(biāo)示,其實(shí)還有一個(gè)屬性UserData,這個(gè)屬性可以由應(yīng)用程序來寫入自定義的一些數(shù)據(jù),我們可以利用這個(gè)字段來存放role的信息,從而達(dá)到基于角色驗(yàn)證的目的。
- privatevoidButton1_Click(objectsender,System.EventArgse)
- {
- //實(shí)體類AdminUserVO對應(yīng)AdminUser用戶表。
- AdminUserVOadminUserVO=newAdminUserVO();
- adminUserVO.Uname=UserName.Text.Trim();
- adminUserVO.Upwd=UserPwd.Text.Trim();
- adminUserVO.LastIP=HttpContext.Current.Request.UserHostAddress;
- adminUserVO.LastTime=DateTime.Now;
- boolflag=(newLoginDAO()).Chk(adminUserVO);
- if(flag)
- {
- //非角色驗(yàn)證時(shí)可以用這句:
- //System.Web.Security.FormsAuthentication.SetAuthCookie(UserName.Text.Trim(),false);
- //創(chuàng)建角色驗(yàn)證信息,把role信息寫入到UserData中
- SetLoginCookie(adminUserVO,adminUserVO.Roles.ToLower());
- HttpContext.Current.Response.Redirect("Main.aspx");
- }
- else
- {
- HttpContext.Current.Response.Write("登錄失敗");
- }
- }
【編輯推薦】