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