ASP.NET中的認證與授權

作者: qianlifeng  來源: 博客園  發布時間: 2010-12-26 21:36  閱讀: 1355 次  推薦: 1   原文鏈接   [收藏]  
摘要:首先聲明一下,認證與授權遠遠不止我下面講的這么簡單(否則吉日也沒必要在這上面浸淫多年了^_^)。下文介紹了asp.net中如何通過自帶的功能實現用戶認證與授權,而不必在頁面中在寫判斷session是否為空等等判斷了。如果您已有這方面的知識還是直接略過吧……

  用戶認證

  .net提供了3種用戶認證的方式,分別是Windows,Forms,Passport。這幾種形式的定義可以在網站根目錄下Web.config中的authentication節點中看見。Windows是默認的驗證形式,它是根據機器的訪問權限來判斷的。Passport是微軟提供的一種驗證形式,不常用。我們需要的知道并了解的是forms形式。forms驗證就是表單認證,提供了以身份id和密碼的形式進行驗證和授權管理的功能。

在正式使用forms驗證之前我們先看看它運行的一個流程:

用戶認證與授權

  從上圖我們可以看出我們需要做一下幾件事情:

  1.配置web.config啟用forms驗證

  2.配置授權設置(哪些頁面未注冊用戶可以訪問)

  3.登錄頁面中生成用戶票據便于其他頁面訪問

  下面就來通過一個項目例子演示如何解決。源代碼我會在下面放出來,大家可以參照源代碼看看。先看看項目的截圖以便有個直觀的了解:

項目

  配置web.config

  配置方法如下,沒有驗證的用戶根據配置自動跳轉到loginUrl里面的頁面去登陸。

 
<authentication mode="Forms">
<forms loginUrl="~/Login.aspx" defaultUrl="~/Default.aspx"/>
</authentication>

  配置授權設置

  同樣是在web.config中的<system.web>下增加如下節點,“?”的意思指匿名用戶,而“*”則表示所有用戶。下面這個意思就是說根目錄下的所有頁面拒絕被匿名用戶訪問。當然你也可以在users中填寫指定的用戶ID,不過那樣并不常用。還有deny,allow的順序是先寫allow完了再deny,不然就會出現問題。這個大家要記住。

 
<authorization>
<deny users="?"/>
</authorization>

  生成用戶票據

  我們在登錄事件的邏輯代碼中(Login.aspx下)增加如下代碼:

 
//為用戶創建一個票證,并將其放入cookie或者url中(具體看你怎么設置票證的保存方式)
FormsAuthentication.SetAuthCookie(userId, true);
Response.Redirect(
"Info.aspx");

  很簡單的幾個設置就完成了用戶的認證,是不是比你在每個頁面中都判斷用戶是否登錄簡便的多呢?!當然了,上面的認證只是簡單的認證。假如我要實現User文件夾內的網頁只有登錄用戶可以訪問,其他的則全部用戶都可以訪問怎么做呢?很簡單,不需要你編寫代碼。更改一下配置文件就是了。將根目錄下的web.config的authorization標簽改為<allow users="*"/>。然后在user文件下加一個web.config并修改內容如下:

 
<configuration>
<appSettings/>
<connectionStrings/>
<system.web>
<authorization>
<deny users="?"/> <!--拒絕匿名用戶訪問-->
</authorization>
</system.web>
</configuration>

  現在再去測試看看已經能達到效果了。所以說通過配置文件的組合你可以構造出一個相對復雜的用戶授權訪問機制出來。不過通常我們的用戶不是會員與非會員那么簡單。會員中也有類別,比如初級,高級等等。這些用戶能訪問的用戶也是不一樣的。這時這種簡單的登錄不登錄判斷已經沒有用了,我們需要引入用戶角色的概念,也就是我們下面講的用戶授權。

  用戶授權

      我們這里將的用戶授權主要是基于角色的授權。上面我們已經講過了認證用戶的原理,就是通過用戶登錄的時候給用戶一個表明身份的票據,以后用戶登錄的時候通過這個票據就能知道這個用戶已經被認證了。角色授權就是在給用戶票據的時候在里面假如了一個字符串的角色信息,比如“Administrator”,然后當一個請求過來的時候asp.net會有一個Application_AuthenticateRequest的事件專門用戶驗證用戶認證授權。在這個事件中我們只需將這個字符表達的角色重建給用戶就可以了。可惜的是.net并沒有提供對角色的直接支持,雖然角色字符也被我們保存到了cookie中,不過也在服務器端的角色還原過程還是需要我們自己寫的。我們在Global.asax的Application_AuthenticateRequest方法中增加如下代碼:

 
protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
HttpApplication app
= (HttpApplication)sender;
HttpContext context
= app.Context; //獲取本次Http請求的HttpContext對象
if (context.Request.IsAuthenticated) //驗證過的一般用戶才能進行角色驗證
{
FormsIdentity Id
= (FormsIdentity)context.User.Identity; //當前用戶標識
FormsAuthenticationTicket Ticket = Id.Ticket; //取得身份證票
string[] Roles = Ticket.UserData.Split(','); //將角色數據轉成字符串數組,得到相關的角色信息
context.User = new System.Security.Principal.GenericPrincipal(Id, Roles); //重新生成帶有角色信息的用戶
}
}

  因為我們需要在票據中增加角色信息,所以我們上面的登錄方法中添加票據的方法已經不再適用,更改為如下:

 
//點擊登陸按鈕
//這里假設已經通過了數據庫的對比,確實存在該用戶
string userId = "qianlifeng";
string pa = "123";

string roles = "Administrator"; //從其他地方取得用戶角色數據

FormsAuthenticationTicket Ticket = new FormsAuthenticationTicket(1, userId, DateTime.Now, DateTime.Now.AddMinutes(30), true, roles); //建立身份驗證票對象
string HashTicket = FormsAuthentication.Encrypt(Ticket); //加密序列化驗證票為字符串
HttpCookie UserCookie = new HttpCookie(FormsAuthentication.FormsCookieName, HashTicket); //生成Cookie
Context.Response.Cookies.Add(UserCookie); //票據寫入Cookie
Response.Redirect("Info.aspx");

  最后我們再來更改一下配置文件,設置info.aspx只有Administrator的角色才可以訪問。在根目錄的web.config下<system.web>標簽下面增加如下配置:

 
<location path="Info.aspx">
<system.web>
<authorization>
<allow roles="Administrator"/>
<deny users="*" />
</authorization>
</system.web>
</location>

  表示info.aspx只有administrator角色的會員才能訪問。當然如果你想實現文件夾的授權設置,和上面的設置類似在那個文件夾下面的web.config配置一下即可。

  類似文章推薦

  其實園子內這類的文章已經不少了,我之所以要寫這么一篇主要還是想通過寫博客來加深這塊知識的理解。下面是我找的比較不錯的認證授權的文章,意猶未盡的可以接著再看看。

  無常,http://www.cnblogs.com/wuchang/archive/2004/07/26/27474.aspx

  菩提樹下的楊過.Net,http://www.cnblogs.com/yjmyzz/archive/2010/08/29/1812038.html

  源碼下載:Demo
1
0
 
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()