標籤:object module html attribute source one 持久性 copy plain
讀了幾篇牛人的此方面的文章,自己也動手做了一下,就想有必要總結一下。當然我的文章品質自然不能與人家相比,只是寫給從沒有接觸過這個知識點的朋友。
網站的身份認證我以前只知道session,偶然發現一些牛人提倡用Forms方式,微軟官方也推薦這種方法。詳見使用Session作為身份識別的問題
ASP.NET的身份認證方式是在web.config檔案中configuration->system.web->authentication指定,如
[html] view plain copy print?
- <authentication mode="Forms" >
- <forms cookieless="UseCookies"name="LoginCookieName"loginUrl="~/Default.aspx"></forms>
- </authentication>
mode="Forms"表示的即時Form身份認證方式。另外還有none、passport、windows可選,其他兩個尚不知,windows的方式和SQL server的Management Stdio 的windows身分識別驗證是一個道理。當網站的IP是localhost的時候,網站不用登入即時登入狀態,而只有是其他IP的時候,登入網站才需要輸入原生使用者名稱,密碼。而本文要說的就是Forms身分識別驗證。
程式分為三步:在login.aspx頁面登入寫入cookie;使用者訪問default.aspx程式讀出cookie資料並賦予使用者對應的角色;程式查看Global.asax看使用者是否有許可權訪問該頁面。
1.在登入頁面驗證完身份資訊後的處理
[csharp] view plain copy print?
- var ticket = new FormsAuthenticationTicket(
- 1, name, DateTime.Now, DateTime.Now.AddMinutes(5),true, "admin");//構造使用者票據
- string cookieValue =FormsAuthentication.Encrypt(ticket);
- HttpCookie cookie =new HttpCookie(FormsAuthentication.FormsCookieName, cookieValue);
- Response.Cookies.Remove(cookie.Name);
- Response.Cookies.Add(cookie);
FormsAuthenticationTicket的構造參數說明:版本號碼、票據名、構造時間、到期時間、是否持久化(如果為true表示票據儲存在持久性cookie中,即跨瀏覽器會話),使用者自訂資料(這裡存放的是登入使用者角色列表,用“,”分隔)。
然後將票據加密存進cookie
這是FF中的web developer看到的,value是加密後的結果。Path是指標網站下對某目錄或頁面,”/“則表示針對整個網站。HttpOnly如果為true則表示指令碼程式不能訪問,這樣能防止一些XSS攻擊利用Httponly提升web應用程式安全性
2.在Global.asax中添加的內容
[csharp] view plain copy print?
- void Application_PostAuthenticateRequest(Object sender, EventArgs e)
- {
- HttpApplication App =(HttpApplication)sender;
- HttpContext context = App.Context; //擷取本次Http請求相關的HttpContext對象
- if (context.Request.IsAuthenticated) //驗證過的使用者才進行role的處理
- {
- FormsIdentity Id =context.User.Identity as FormsIdentity;
- FormsAuthenticationTicket Ticket =Id.Ticket; //取得身分識別驗證票
- string[] Roles =Ticket.UserData.Split(‘,‘); //將身分識別驗證票中的role資料即前面儲存在cookie的自訂使用者資料轉成字串數組
- context.User = new GenericPrincipal(Id, Roles); //將原有的Identity加上角色資訊建立一個GenericPrincipal表示目前使用者,這樣目前使用者就擁有了role資訊
- }
- }
Application_PostAuthenticateRequest是asp.Net管線中的一個事件,在頁面請求的時候會觸發。有關詳細知識還有待學習。
這一步也可以自己定義一個實現IHttpModule介面的類,在其中這樣寫:
[csharp] view plain copy print?
- public void Init(HttpApplicationapp)
- {
- app.PostAuthenticateRequest +=Application_PostAuthenticateRequest;
- }
-
- voidApplication_PostAuthenticateRequest(Object sender, EventArgs e)
- {
- //……
- }
使用者在經過第一步的登入後已在瀏覽器上儲存了cookie,再次請求另一個頁面時,經過Global.asax中的Application_PostAuthenticateRequest處理,在context.User中存放了角色資訊。這裡我們構造context.User裡有一個私人的user欄位,這個欄位只能利用IsInRole方法來判斷使用者是否屬於某,我們不能對它修改,而且這個欄位每次初始化的時候總是為空白,我們只好利用這種方式來為使用者附上角色資訊。
3.設定檔中的內容
[html] view plain copy print?
- <system.web>
- <compilationdebugcompilationdebug="true" targetFramework="4.0"/>
- <httpRuntime requestValidationMode="2.0"/>
-
- <!--我在WebSite的App_Code檔案夾下建立了Module檔案夾,並添加了MyModule類-->
- <httpModules>
- <addnameaddname="MyModule"type="MyModule"/>
- </httpModules>
-
- <authentication mode="Forms">
- <!--name是存放cookie資訊的使用者名稱,loginUrl是指定的登入頁面(當使用者沒許可權訪問下面location限制的頁面時會跳轉到此頁面),timeout是cookie到期時間-->
- <forms cookieless="UseCookies" name=" logincookie" loginUrl="~/login.aspx" timeout="5"></forms>
- </authentication>
- <authorization>
- <allowusersallowusers="*"/>
- </authorization>
- </system.web>
-
- <!--location中的path可以是一個檔案夾,也可以是一個頁面,來限制某些頁面的存取權限。下面表示Default.aspx只對admin角色開發。注意,如果限制某些頁面只能被某些角色訪問,則最後一定要加<deny users="*"/>-->
- <location path="Default.aspx">
- <system.web>
- <authorization>
- <allow roles="admin"/>
- <deny users="*"/>
- </authorization>
- </system.web>
- </location>
程式執行完第二步,到設定檔中查看角色是否有許可權訪問請求頁面。
原始碼
參考文章:細說ASP.NET Forms身份認證 asp.net中使用基於角色role的Forms驗證
另外強烈推薦一個部落格:http://www.cnblogs.com/fish-li/
簡單的ASP.NET Forms身份認證