asp.net中使用基於角色的身份Forms驗證 (1)

來源:互聯網
上載者:User

asp.net中使用基於角色的身份Forms驗證,大致分為四個步驟
1.配置系統檔案web.config

<system.web>
<authentication mode="Forms" >
<forms name=".yaoCookies" loginUrl="/duan/Manage/login.aspx" protection="All"
   timeout="20" path="/" />
</authentication>
</system.web>

<forms>標籤中的name表示指定要用於身分識別驗證的 HTTP Cookie. 預設情況下,name 的值是 .ASPXAUTH。採用此種方式驗證使用者後,以此使用者的資訊建立一個FormsAuthenticationTicket類型的身分識別驗證票,再加密序列化為一個字串,最後將這個字串寫到用戶端的name指定名字的Cookie中.一旦這個Cookie寫到用戶端後,此使用者再次訪問這個web應用時會將連同Cookie一起發送到服務端,服務端將會知道此使用者是已經驗證過的.

<forms>標籤中的loginurl指沒有經過身分識別驗證的使用者將會自動的定向到loginurl所指向的路徑. 如果驗證使用者有效,則產生同此使用者對應的身分識別驗證票,寫到用戶端的Cookie,最後將瀏覽器重新導向到使用者初試請求的頁面.其中用System.Web.Security.FormsAuthentication.RedirectFromLoginPage ()方法實現重新導向.

<forms>標籤中的timeout和path,是提供了身分識別驗證票寫入到Cookie到期時間和預設路徑

2.在受保護的檔案夾如Manage下建立一web.config檔案,內容如

<configuration>
   <!--指定對整個Manage目錄的存取權限-->
   <system.web>
      <authorization>
            <!--多個角色用,分隔-->
            <allow roles="admin,user"/>
            <deny users="*" />
        </authorization>
   </system.web>

   <!--也可控制某個頁的許可權

   <location path="AnnounceList.aspx">
      <system.web>
         <authorization>
            <allow roles="admin"/>
            <deny users="*" />
         </authorization>
      </system.web>
   </location>

   <location path="ConfigInfo.aspx">
      <system.web>
         <authorization>
            <allow roles="users"/>
            <deny users="*" />
         </authorization>
      </system.web>
   </location>

   -->
</configuration>

註:此配置內容也可以加入到系統的web.config檔案中,注意加入位置:

........
     </system.web>

     <location path="Manage/AnnounceList.aspx">
      <system.web>
       <authorization>
        <allow roles="admin"/>
        <deny users="*" />
       </authorization>
      </system.web>
     </location>

</configuration>

3.登入頁

<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; BORDER-BOTTOM-WIDTH: 1px; BORDER-BOTTOM-COLOR: #cccccc; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%">//登入按鈕
private void Button1_Click(object sender, System.EventArgs e)
{
             //實體類AdminUserVO對應AdminUser使用者表。
             AdminUserVO adminUserVO = new AdminUserVO();

             adminUserVO.Uname = UserName.Text.Trim();
             adminUserVO.Upwd = UserPwd.Text.Trim();
             adminUserVO.LastIP = HttpContext.Current.Request.UserHostAddress;
             adminUserVO.LastTime = DateTime.Now;

             bool flag = (new LoginDAO()).Chk(adminUserVO);

             if (flag)
             {
                 //非角色驗證時可以用這句:
                 //System.Web.Security.FormsAuthentication.SetAuthCookie(UserName.Text.Trim(),false);

                 //建立角色驗證資訊,把role資訊寫入到UserData中
                 SetLoginCookie(adminUserVO,adminUserVO.Roles.ToLower());

                 HttpContext.Current.Response.Redirect("Main.aspx");
             }
             else
             {
                 HttpContext.Current.Response.Write("登入失敗");
             }
}
</DIV> 

<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; BORDER-BOTTOM-WIDTH: 1px; BORDER-BOTTOM-COLOR: #cccccc; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 88.76%; HEIGHT: 203px">//SetLoginCookie方法
public static void SetLoginCookie(AdminUserVO u, string roles)
   {
    //建立身分識別驗證票對象
    FormsAuthenticationTicket ticket = new FormsAuthenticationTicket (1,u.Uname, DateTime.Now, DateTime.Now.AddMinutes(30), false,roles,"/");
    //加密序列化驗證票為字串
    string hashTicket = FormsAuthentication.Encrypt (ticket) ;
    HttpCookie userCookie = new HttpCookie(FormsAuthentication.FormsCookieName, hashTicket);
    HttpContext.Current.Response.Cookies.Add(userCookie);
   }
</DIV> 
FormsAuthenticationTicket參數說明:
FormsAuthenticationTicket(
int version, //設為1,版本號碼由系統自動提供
string name, //使用者標示,擷取與身分識別驗證 Cookie 關聯的使用者名稱
DateTime issueDate, //Cookie 的發出時間, 設定為 DateTime.Now
DateTime expiration, //擷取 Cookie 到期的日期/時間
bool isPersistent, //是否持久性(根據需要設定,若是設定為持久性,在發出cookie時,cookie的Expires設定一定要設定),如果已發出持久的 Cookie,則返回 true。否則,身分識別驗證 Cookie 將限制在瀏覽器生命週期範圍內。
string userData, //擷取儲存在 Cookie 中的應用程式定義字串,這裡用上面準備好的用逗號分割的role字串
string cookiePath // 返回傳出 Cookie 的路徑。注意,表單的路徑設定為"/",這要同發出cookie的路徑一致,因為重新整理cookie要用這個路徑。由於表單區分大小寫,這是為了防止網站中的 URL 的大小寫不一致而採取的一種保護措施。
);

4.Global.asax.cs

<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; BORDER-BOTTOM-WIDTH: 1px; BORDER-BOTTOM-COLOR: #cccccc; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%">protected void Application_AuthenticateRequest(Object sender, EventArgs e)
   {
    HttpApplication app = (HttpApplication) sender; 
    HttpContext ctx = app.Context ; //擷取本次Http請求的HttpContext對象 
    if (ctx.User != null)
    {
     if (ctx.Request.IsAuthenticated == true) //驗證過的一般使用者才能進行角色驗證 
     { 
      System.Web.Security.FormsIdentity fi = (System.Web.Security.FormsIdentity)ctx.User.Identity ; 
      System.Web.Security.FormsAuthenticationTicket ticket = fi.Ticket ; //取得身分識別驗證票 
      string userData = ticket.UserData;//從UserData中恢複role資訊
      string[] roles = userData.Split (',') ; //將角色資料轉成字串數組,得到相關的角色資訊 
      ctx.User = new System.Security.Principal.GenericPrincipal (fi, roles) ; //這樣目前使用者就擁有角色資訊了
     }
    }
   }</DIV> 
注:如果使用HttpModule的話,此處代碼應該加入在AuthenticateRequest事件中

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/Python/archive/2008/11/11/3277230.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.