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