欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

ASP.net Forms驗(yàn)證Demo

 更新時(shí)間:2009年01月03日 00:47:41   作者:  
Asp.net中基于Forms驗(yàn)證的角色驗(yàn)證授權(quán)

Forms身份驗(yàn)證基于角色的授權(quán)

一 身份驗(yàn)證

在web.config的<authentication>的設(shè)置還是一樣:

<authentication mode="forms">
<forms name=".ASPXAUTH" loginUrl="/login.aspx" timeout="30" path= "/">
</forms>
</authentication>

/login.aspx驗(yàn)證用戶(hù)合法性頁(yè)面中,在驗(yàn)證了用戶(hù)的合法性后,還要有個(gè)取得此用戶(hù)屬于哪些role的過(guò)程,這個(gè)看各個(gè)應(yīng)用的本身如何設(shè)計(jì)的了,一般是在數(shù)據(jù)庫(kù)中會(huì)有個(gè)use_role表,可以從數(shù)據(jù)庫(kù)中獲得此用戶(hù)屬于哪些role,在此不深究如何去獲取用戶(hù)對(duì)應(yīng)的role,最后肯定能夠獲得的此用戶(hù)對(duì)應(yīng)的所有的role用逗號(hào)分割的一個(gè)字符串。
在上面的非基于角色的方法中,我們用了FormsAuthentication.RedirectFromLoginPage 方法來(lái)完成生成身份驗(yàn)證票,寫(xiě)回客戶(hù)端,瀏覽器重定向等一系列的動(dòng)作。這個(gè)方法會(huì)用一些確省的設(shè)置來(lái)完成一系列的動(dòng)作,在基于角色的驗(yàn)證中我們不能用這一個(gè)方法來(lái)實(shí)現(xiàn),要分步的做,以便將一些定制的設(shè)置加進(jìn)來(lái):

1. 首先要根據(jù)用戶(hù)標(biāo)示,和用戶(hù)屬于的角色的字符串來(lái)創(chuàng)建身份驗(yàn)證票
public FormsAuthenticationTicket(
int version, //設(shè)為1
string name, //用戶(hù)標(biāo)示
DateTime issueDate, //Cookie 的發(fā)出時(shí)間, 設(shè)置為 DateTime.Now
DateTime expiration, //過(guò)期時(shí)間
bool isPersistent, //是否持久性(根據(jù)需要設(shè)置,若是設(shè)置為持久性,在發(fā)出
cookie時(shí),cookie的Expires設(shè)置一定要設(shè)置)
string userData, //這里用上面準(zhǔn)備好的用逗號(hào)分割的role字符串
string cookiePath // 設(shè)為"/",這要同發(fā)出cookie的路徑一致,因?yàn)樗⑿耤ookie
要用這個(gè)路徑
);

FormsAuthenticationTicket Ticket = new FormsAuthenticationTicket (1,"kent",DateTime.Now, DateTime.Now.AddMinutes(30), false,UserRoles,"/") ;

2. 生成身份驗(yàn)證票的Cookie
2.1 將身份驗(yàn)證票加密序列化成一個(gè)字符串
string HashTicket = FormsAuthentication.Encrypt (Ticket) ;
2.2 生成cookie
HttpCookie UserCookie = new HttpCookie(FormsAuthentication.FormsCookieName, HashTicket) ;
FormsAuthentication.FormsCookieName 是用來(lái)獲取web.config中設(shè)置的身份驗(yàn)證cookie的名字,缺省為" .ASPXAUTH".
若身份驗(yàn)證票中的isPersistent屬性設(shè)置為持久類(lèi),則這個(gè)cookie的Expires屬性一定要設(shè)置,這樣這個(gè)cookie才會(huì)被做為持久cookie保存到客戶(hù)端的cookie文件中.
3. 將身份驗(yàn)證票Cookie輸出到客戶(hù)端
通過(guò)Response.Cookies.Add(UserCookie) 將身份驗(yàn)證票Cookie附加到輸出的cookie集合中,發(fā)送到客戶(hù)端.
4. 重定向到用戶(hù)申請(qǐng)的初試頁(yè)面.

驗(yàn)證部分代碼(這部分代碼是在login.aspx頁(yè)面上點(diǎn)擊了登錄按鈕事件處理代碼):

private void Buttonlogin_Click(object sender, System.EventArgs e)
{
string user = TextBoxUser.Text; //讀取用戶(hù)名
string password = TextBoxPassword.Text; //讀取密碼
if(Confirm(user,password) == true) //confirm方法用來(lái)驗(yàn)證用戶(hù)合法性的
{
string userRoles = UserToRole(user); //調(diào)用UserToRole方法來(lái)獲取role字符串
FormsAuthenticationTicket Ticket = new FormsAuthenticationTicket (1,user,DateTime.Now, DateTime.Now.AddMinutes(30), false,userRoles,"/") ; //建立身份驗(yàn)證票對(duì)象
string HashTicket = FormsAuthentication.Encrypt (Ticket) ; //加密序列化驗(yàn)證票為字符串
HttpCookie UserCookie = new HttpCookie(FormsAuthentication.FormsCookieName, HashTicket) ;
//生成Cookie
Context.Response.Cookies.Add (UserCookie) ; //輸出Cookie
Context.Response.Redirect (Context.Request["ReturnUrl"]) ; // 重定向到用戶(hù)申請(qǐng)的初始頁(yè)面
}
else
{
// 用戶(hù)身份未被確認(rèn)時(shí)的代碼
}
}
//此方法用來(lái)驗(yàn)證用戶(hù)合法性的
private bool Confirm(string user,string password)
{
//相應(yīng)的代碼
}
//此方法用來(lái)獲得的用戶(hù)對(duì)應(yīng)的所有的role用逗號(hào)分割的一個(gè)字符串
private string UserToRole(string user)
{
//相應(yīng)的代碼
}

二 基于角色訪問(wèn)授權(quán)

這里我們要做的是,將客戶(hù)端保存的身份驗(yàn)證票中UserData中保存的表示角色的信息恢復(fù)到在服務(wù)端表示用戶(hù)身份的GenericPrincipal對(duì)象中(記住,原來(lái)的驗(yàn)證過(guò)程中, GenericPrincipal對(duì)象只包含了用戶(hù)信息,沒(méi)有包含role信息)
一個(gè)Http請(qǐng)求的過(guò)程中,HttpApplication.AuthenticateRequest事件表示安全模塊已建立用戶(hù)標(biāo)識(shí),就是此用戶(hù)的身份在web端已經(jīng)建立起來(lái), 在這個(gè)事件之后我們就可以獲取用戶(hù)身份信息了.
在HttpApplication.ResolveRequestCache事件之前,asp.net開(kāi)始取得用戶(hù)請(qǐng)求的頁(yè)面,建立HttpHandler控制點(diǎn),這時(shí)就已經(jīng)要驗(yàn)證用戶(hù)的權(quán)限了,所以恢復(fù)用戶(hù)角色的工作只能在HttpApplication.AuthenticateRequest事件和HttpApplication.ResolveRequestCache事件之間的過(guò)程中做.
我們選擇Application_AuthorizeRequest事件中做這個(gè)工作,可以在global.asax文件中處理HttpApplication的所有的事件,代碼如下:

protected void Application_AuthorizeRequest(object sender, System.EventArgs e)
{
HttpApplication App = (HttpApplication) sender;
HttpContext Ctx = App.Context ; //獲取本次Http請(qǐng)求相關(guān)的HttpContext對(duì)象
if (Ctx.Request.IsAuthenticated == true) //驗(yàn)證過(guò)的用戶(hù)才進(jìn)行role的處理
{
FormsIdentity Id = (FormsIdentity)Ctx.User.Identity ;
FormsAuthenticationTicket Ticket = Id.Ticket ; //取得身份驗(yàn)證票
string[] Roles = Ticket.UserData.Split (',') ; //將身份驗(yàn)證票中的role數(shù)據(jù)轉(zhuǎn)成字符串?dāng)?shù)組
Ctx.User = new GenericPrincipal (Id, Roles) ; //將原有的Identity加上角色信息新建一個(gè)GenericPrincipal表示當(dāng)前用戶(hù),這樣當(dāng)前用戶(hù)就擁有了role信息
}
}

訪問(wèn)者同時(shí)具有了user和role信息,就可以據(jù)此在web.config中用role來(lái)控制用戶(hù)的訪問(wèn)權(quán)限了.

相關(guān)文章

最新評(píng)論