Asp.net中的認證與授權

來源:互聯網
上載者:User

     首先聲明一下,認證與授權遠遠不止我下面講的這麼簡單(否則吉日也沒必要在這上面浸淫多年了^_^)。下文介紹了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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.