1. 程式人生 > >Asp.net中的認證與授權

Asp.net中的認證與授權

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