簡單的ASP.NET Forms身份認證

來源:互聯網
上載者:User

標籤:object   module   html   attribute   source   one   持久性   copy   plain   

   讀了幾篇牛人的此方面的文章,自己也動手做了一下,就想有必要總結一下。當然我的文章品質自然不能與人家相比,只是寫給從沒有接觸過這個知識點的朋友。

  網站的身份認證我以前只知道session,偶然發現一些牛人提倡用Forms方式,微軟官方也推薦這種方法。詳見使用Session作為身份識別的問題

 

  ASP.NET的身份認證方式是在web.config檔案中configuration->system.web->authentication指定,如

 

[html] view plain copy  print?
  1. <authentication mode="Forms" >  
  2.           <forms cookieless="UseCookies"name="LoginCookieName"loginUrl="~/Default.aspx"></forms>  
  3. </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?
  1. var ticket = new FormsAuthenticationTicket(  
  2.         1, name, DateTime.Now, DateTime.Now.AddMinutes(5),true, "admin");//構造使用者票據  
  3. string cookieValue =FormsAuthentication.Encrypt(ticket);  
  4. HttpCookie cookie =new HttpCookie(FormsAuthentication.FormsCookieName, cookieValue);  
  5. Response.Cookies.Remove(cookie.Name);  
  6. 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?
  1. void Application_PostAuthenticateRequest(Object sender, EventArgs e)  
  2.     {  
  3.         HttpApplication App =(HttpApplication)sender;  
  4.         HttpContext context = App.Context; //擷取本次Http請求相關的HttpContext對象  
  5.         if (context.Request.IsAuthenticated) //驗證過的使用者才進行role的處理  
  6.         {  
  7.             FormsIdentity Id =context.User.Identity as FormsIdentity;  
  8.             FormsAuthenticationTicket Ticket =Id.Ticket; //取得身分識別驗證票  
  9.             string[] Roles =Ticket.UserData.Split(‘,‘); //將身分識別驗證票中的role資料即前面儲存在cookie的自訂使用者資料轉成字串數組  
  10.             context.User = new GenericPrincipal(Id, Roles); //將原有的Identity加上角色資訊建立一個GenericPrincipal表示目前使用者,這樣目前使用者就擁有了role資訊  
  11.         }  
  12.     }  

 

 

Application_PostAuthenticateRequest是asp.Net管線中的一個事件,在頁面請求的時候會觸發。有關詳細知識還有待學習。

這一步也可以自己定義一個實現IHttpModule介面的類,在其中這樣寫:

 

[csharp] view plain copy  print?
  1. public void Init(HttpApplicationapp)  
  2.     {  
  3.         app.PostAuthenticateRequest +=Application_PostAuthenticateRequest;  
  4.     }  
  5.    
  6.     voidApplication_PostAuthenticateRequest(Object sender, EventArgs e)  
  7.     {  
  8.         //……  
  9.     }  

 

使用者在經過第一步的登入後已在瀏覽器上儲存了cookie,再次請求另一個頁面時,經過Global.asax中的Application_PostAuthenticateRequest處理,在context.User中存放了角色資訊。這裡我們構造context.User裡有一個私人的user欄位,這個欄位只能利用IsInRole方法來判斷使用者是否屬於某,我們不能對它修改,而且這個欄位每次初始化的時候總是為空白,我們只好利用這種方式來為使用者附上角色資訊。

 

3.設定檔中的內容 

[html] view plain copy  print?
  1. <system.web>  
  2.     <compilationdebugcompilationdebug="true" targetFramework="4.0"/>  
  3.     <httpRuntime requestValidationMode="2.0"/>  
  4.    
  5.    <!--我在WebSite的App_Code檔案夾下建立了Module檔案夾,並添加了MyModule類-->  
  6.     <httpModules>  
  7.       <addnameaddname="MyModule"type="MyModule"/>  
  8.     </httpModules>  
  9.      
  10.     <authentication mode="Forms">  
  11.     <!--name是存放cookie資訊的使用者名稱,loginUrl是指定的登入頁面(當使用者沒許可權訪問下面location限制的頁面時會跳轉到此頁面),timeout是cookie到期時間-->  
  12.       <forms cookieless="UseCookies" name=" logincookie" loginUrl="~/login.aspx" timeout="5"></forms>  
  13.     </authentication>  
  14.     <authorization>  
  15.       <allowusersallowusers="*"/>  
  16.     </authorization>  
  17.  </system.web>  
  18.   
  19.    <!--location中的path可以是一個檔案夾,也可以是一個頁面,來限制某些頁面的存取權限。下面表示Default.aspx只對admin角色開發。注意,如果限制某些頁面只能被某些角色訪問,則最後一定要加<deny users="*"/>-->  
  20.   <location path="Default.aspx">  
  21.     <system.web>  
  22.       <authorization>  
  23.         <allow roles="admin"/>  
  24.         <deny users="*"/>  
  25.       </authorization>  
  26.     </system.web>  
  27.   </location>  

 

程式執行完第二步,到設定檔中查看角色是否有許可權訪問請求頁面。

原始碼

參考文章:細說ASP.NET Forms身份認證 asp.net中使用基於角色role的Forms驗證 

另外強烈推薦一個部落格:http://www.cnblogs.com/fish-li/

簡單的ASP.NET Forms身份認證

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.