用戶認(rèn)證
.net提供了3種用戶認(rèn)證的方式,分別是Windows,Forms,Passport。這幾種形式的定義可以在網(wǎng)站根目錄下Web.config中的authentication節(jié)點(diǎn)中看見。Windows是默認(rèn)的驗(yàn)證形式,它是根據(jù)機(jī)器的訪問權(quán)限來判斷的。Passport是微軟提供的一種驗(yàn)證形式,不常用。我們需要的知道并了解的是forms形式。forms驗(yàn)證就是表單認(rèn)證,提供了以身份id和密碼的形式進(jìn)行驗(yàn)證和授權(quán)管理的功能。
在正式使用forms驗(yàn)證之前我們先看看它運(yùn)行的一個(gè)流程:
從上圖我們可以看出我們需要做一下幾件事情:
1.配置web.config啟用forms驗(yàn)證
2.配置授權(quán)設(shè)置(哪些頁面未注冊(cè)用戶可以訪問)
3.登錄頁面中生成用戶票據(jù)便于其他頁面訪問
下面就來通過一個(gè)項(xiàng)目例子演示如何解決。源代碼我會(huì)在下面放出來,大家可以參照源代碼看看。先看看項(xiàng)目的截圖以便有個(gè)直觀的了解:
配置web.config。
配置方法如下,沒有驗(yàn)證的用戶根據(jù)配置自動(dòng)跳轉(zhuǎn)到loginUrl里面的頁面去登陸。
配置授權(quán)設(shè)置
同樣是在web.config中的下增加如下節(jié)點(diǎn),“?”的意思指匿名用戶,而“*”則表示所有用戶。下面這個(gè)意思就是說根目錄下的所有頁面拒絕被匿名用戶訪問。當(dāng)然你也可以在users中填寫指定的用戶ID,不過那樣并不常用。還有deny,allow的順序是先寫allow完了再deny,不然就會(huì)出現(xiàn)問題。這個(gè)大家要記住。
生成用戶票據(jù)
我們?cè)诘卿浭录倪壿嫶a中(Login.html下)增加如下代碼:
//為用戶創(chuàng)建一個(gè)票證,并將其放入cookie或者url中(具體看你怎么設(shè)置票證的保存方式)
FormsAuthentication.SetAuthCookie(userId,true);
Response.Redirect("Info.html");
很簡(jiǎn)單的幾個(gè)設(shè)置就完成了用戶的認(rèn)證,是不是比你在每個(gè)頁面中都判斷用戶是否登錄簡(jiǎn)便的多呢?!當(dāng)然了,上面的認(rèn)證只是簡(jiǎn)單的認(rèn)證。假如我要實(shí)現(xiàn)User文件夾內(nèi)的網(wǎng)頁只有登錄用戶可以訪問,其他的則全部用戶都可以訪問怎么做呢?很簡(jiǎn)單,不需要你編寫代碼。更改一下配置文件就是了。將根目錄下的web.config的authorization標(biāo)簽改為。然后在user文件下加一個(gè)web.config并修改內(nèi)容如下:
現(xiàn)在再去測(cè)試看看已經(jīng)能達(dá)到效果了。所以說通過配置文件的組合你可以構(gòu)造出一個(gè)相對(duì)復(fù)雜的用戶授權(quán)訪問機(jī)制出來。不過通常我們的用戶不是會(huì)員與非會(huì)員那么簡(jiǎn)單。會(huì)員中也有類別,比如初級(jí),高級(jí)等等。這些用戶能訪問的用戶也是不一樣的。這時(shí)這種簡(jiǎn)單的登錄不登錄判斷已經(jīng)沒有用了,我們需要引入用戶角色的概念,也就是我們下面講的用戶授權(quán)。
用戶授權(quán)
我們這里將的用戶授權(quán)主要是基于角色的授權(quán)。上面我們已經(jīng)講過了認(rèn)證用戶的原理,就是通過用戶登錄的時(shí)候給用戶一個(gè)表明身份的票據(jù),以后用戶登錄的時(shí)候通過這個(gè)票據(jù)就能知道這個(gè)用戶已經(jīng)被認(rèn)證了。角色授權(quán)就是在給用戶票據(jù)的時(shí)候在里面假如了一個(gè)字符串的角色信息,比如“Administrator”,然后當(dāng)一個(gè)請(qǐng)求過來的時(shí)候asp.net會(huì)有一個(gè)Application_AuthenticateRequest的事件專門用戶驗(yàn)證用戶認(rèn)證授權(quán)。在這個(gè)事件中我們只需將這個(gè)字符表達(dá)的角色重建給用戶就可以了??上У氖?net并沒有提供對(duì)角色的直接支持,雖然角色字符也被我們保存到了cookie中,不過也在服務(wù)器端的角色還原過程還是需要我們自己寫的。我們?cè)贕lobal.asax的Application_AuthenticateRequest方法中增加如下代碼:
protectedvoidApplication_AuthenticateRequest(objectsender,EventArgse)
{
HttpApplicationapp=(HttpApplication)sender;
HttpContextcontext=app.Context;//獲取本次Http請(qǐng)求的HttpContext對(duì)象
if(context.Request.IsAuthenticated)//驗(yàn)證過的一般用戶才能進(jìn)行角色驗(yàn)證
{
FormsIdentityId=(FormsIdentity)context.User.Identity;//當(dāng)前用戶標(biāo)識(shí)
FormsAuthenticationTicketTicket=Id.Ticket;//取得身份證票
string[]Roles=Ticket.UserData.Split(',');//將角色數(shù)據(jù)轉(zhuǎn)成字符串?dāng)?shù)組,得到相關(guān)的角色信息
context.User=newSystem.Security.Principal.GenericPrincipal(Id,Roles);//重新生成帶有角色信息的用戶
}
}
因?yàn)槲覀冃枰谄睋?jù)中增加角色信息,所以我們上面的登錄方法中添加票據(jù)的方法已經(jīng)不再適用,更改為如下:
//點(diǎn)擊登陸按鈕
//這里假設(shè)已經(jīng)通過了數(shù)據(jù)庫的對(duì)比,確實(shí)存在該用戶
stringuserId="qianlifeng";
stringpa="123";
stringroles="Administrator";//從其他地方取得用戶角色數(shù)據(jù)
FormsAuthenticationTicketTicket=newFormsAuthenticationTicket(1,userId,DateTime.Now,DateTime.Now.AddMinutes(30),true,roles);//建立身份驗(yàn)證票對(duì)象
stringHashTicket=FormsAuthentication.Encrypt(Ticket);//加密序列化驗(yàn)證票為字符串
HttpCookieUserCookie=newHttpCookie(FormsAuthentication.FormsCookieName,HashTicket);//生成Cookie
Context.Response.Cookies.Add(UserCookie);//票據(jù)寫入Cookie
Response.Redirect("Info.html");
最后我們?cè)賮砀囊幌屡渲梦募?,設(shè)置info.html只有Administrator的角色才可以訪問。在根目錄的web.config下標(biāo)簽下面增加如下配置:
表示info.html只有administrator角色的會(huì)員才能訪問。當(dāng)然如果你想實(shí)現(xiàn)文件夾的授權(quán)設(shè)置,和上面的設(shè)置類似在那個(gè)文件夾下面的web.config配置一下即可。
對(duì)于網(wǎng)站開發(fā)\網(wǎng)站建設(shè)這一塊來說,蒙特對(duì)于大家應(yīng)該不會(huì)陌生,15年網(wǎng)站開發(fā)領(lǐng)軍平臺(tái),如果大家還不了解我們,請(qǐng)大家多關(guān)注一下,相信互聯(lián)網(wǎng)的不斷發(fā)展大家需要我們的技術(shù)支持,商機(jī)的創(chuàng)建和引進(jìn)找我們你選對(duì)了!
©2000-2022 杭州蒙特信息技術(shù)有限公司版權(quán)所有
Mountor、蒙特是Mountor Corp.的注冊(cè)商標(biāo)。