ASP.net Forms驗(yàn)證Demo
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)限了.
- 淺談asp.net Forms身份驗(yàn)證詳解
- 詳解ASP.NET MVC Form表單驗(yàn)證
- 關(guān)于C#.net winform程序驗(yàn)證moss的集成身份認(rèn)證實(shí)例
- Asp.Net二級(jí)域名共享Forms身份驗(yàn)證、下載站/圖片站的授權(quán)訪問(wèn)控制
- ASP.NET Internet安全Forms身份驗(yàn)證方法
- asp.net forms身份驗(yàn)證,避免重復(fù)造輪子
- asp.net 基于forms驗(yàn)證的目錄角色權(quán)限的實(shí)現(xiàn)
- asp.net Forms身份驗(yàn)證和基于角色的權(quán)限訪問(wèn)
- asp.net 特定目錄form驗(yàn)證
- .net MVC使用IPrincipal進(jìn)行Form登錄即權(quán)限驗(yàn)證(3)
相關(guān)文章
Community Server專(zhuān)題二:體系結(jié)構(gòu)
Community Server專(zhuān)題二:體系結(jié)構(gòu)...2007-03-03asp.net+jquery Gridview的多行拖放, 以及跨控件拖放
學(xué)習(xí)JQuery時(shí),發(fā)現(xiàn)JQuery只能做單行拖放, 于是花時(shí)間做了一個(gè)多行拖放的例子, 以備以后使用。2009-11-11WPF實(shí)現(xiàn)ScrollViewer滾動(dòng)到指定控件處
這篇文章主要為大家詳細(xì)介紹了WPF實(shí)現(xiàn)ScrollViewer滾動(dòng)到指定控件處,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06使用Aspose.Cells實(shí)現(xiàn)導(dǎo)入導(dǎo)出
這篇文章主要為大家詳細(xì)介紹了如何使用Aspose.Cells實(shí)現(xiàn)導(dǎo)入導(dǎo)出,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12silverlight2.0Beta版TextBox輸入中文解決方法
silverlight Beta 2.0 中TetBox輸入漢字,除MS自己的輸入法,其它所有輸入法都會(huì)出現(xiàn)輸入的東西會(huì)在TextBox中重復(fù)一次的現(xiàn)像,google ,Baidu了一下,大家說(shuō)好像是silverlight自己的一個(gè)BUG,可能會(huì)在Repleass的時(shí)候修改。2008-10-10asp.net基于HashTable實(shí)現(xiàn)購(gòu)物車(chē)的方法
這篇文章主要介紹了asp.net基于HashTable實(shí)現(xiàn)購(gòu)物車(chē)的方法,涉及asp.net中HashTable結(jié)合session實(shí)現(xiàn)購(gòu)物車(chē)功能的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-12-12ASP.NET 使用application與session對(duì)象寫(xiě)的簡(jiǎn)單聊天室程序
寫(xiě)了快一年的asp.net,application對(duì)象還真沒(méi)怎么用過(guò)??戳丝磿?shū),根據(jù)這兩個(gè)對(duì)象的特性寫(xiě)了一個(gè)簡(jiǎn)單的聊天室程序。真的是非常的簡(jiǎn)陋2014-07-07.net decimal保留指定的小數(shù)位數(shù)(不四舍五入)
大家都知道decimal保留指定位數(shù)小數(shù)的時(shí)候,.NET自帶的方法都是四舍五入的。那么如何讓decimal保留指定位數(shù)小數(shù)的時(shí)候不四舍五入呢,下面通過(guò)這篇文中的示例代碼來(lái)一起看看吧。2016-12-12