程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> ASP.NET安全問題--ASP.NET生命周期中的驗證以及身份驗證模塊

ASP.NET安全問題--ASP.NET生命周期中的驗證以及身份驗證模塊

編輯:.NET實例教程
本篇主要一下話題:

  1.ASP.Net運行的生命周期的驗證

  2.身份驗證模塊

  3.授權模塊 

  1.ASP.Net運行的生命周期的驗證

  其實在ASP.Net中每一個請求都進行了驗證和授權的。進行驗證和授權的過程實際上是通過觸發相應的事件來完成的。

  在講述驗證事件之前,首先清晰一個流程:ASP.Net運行時接到一個請求的處理的流程。

  先把流程描述一下,使得大家有個總體把握:一個請求來了,經過IIS,通過ISAPI,就到達了ASP.NET的管道中,然後經過一些的轉化和包裝,然後ASP.Net運行時開始處理這個請求了,然後是進行驗證和授權,然後再進行一系列的處理,最後確定請求是是什麼文件,如果是.ASPx的,那麼然後就開始頁面的生命周期,如下圖。

ASP.NET安全問題--ASP.NET生命周期中的驗證以及身份驗證模塊 

  下面就處理請求時候觸發的事件順序如下:

       BeginRequest: 開發處理請求,是處理ASP.Net請求時觸發的第一個事件 
       AuthenticateRequest:處理身份驗證
       ...
       AuthorizeRequest:處理授權
       ...

  所以大家可以看出,其實在請求的處理過程中,身份的驗證和授權發生的時期是很早的。而且有關驗證的一些信息,如用戶名和角色在處理完這兩個事件之後就已經確定,並且填充。下面我想用個圖來講述:

ASP.NET安全問題--ASP.NET生命周期中的驗證以及身份驗證模塊 

一般對於請求的驗證和授權,我們是希望也應該自己控制這個過程的,所以我們可以在AuthenticateRequest和AuthorizeRequest的事件處理中加入我們自己的代碼。一般在網站中加入 Global.asax文件。

  AuthenticateRequest事件:

  當一個請求需要進行身份驗證時,HttpApplication對象就會觸發AuthenticateRequest事件,這也意味著每次對ASP.Net應用程序進行頁面請求時都會觸發這個事件。

  在這個事件中實際上是調用相應的身份驗證模塊來處理身份驗證的。例如對於Forms身份驗證模塊而言,就是從加密的cookIE中提取用戶信息。

  AuthorizeRequest事件:

  AuthorizeRequest事件是在AuthenticateRequest事件中通過了身份驗證時候才觸發的。AuthorizeRequest事件調用相應的授權模塊來檢查用戶是否被授權訪問他們請求的資源。因為在AuthenticateRequest事件完成之後就已經有了用戶的表示Identity和IPricipal,也就知道了用戶名和角色的信息。

  2.身份驗證模塊

  身份驗證是利用ASP.NET中的身份驗證模塊來實現的。在ASP.Net中內置有四個驗證模塊:

  DefaultAuthenticateModule,FormsAuthenticateModule,WindowsAuthenticateModule,PassportAuthenticateModule.他們都實現了IHttpModule接口,當然,如果需要,我們也可以實現自定義的驗證模塊。

  從驗證模塊就可以看出我們一般的身份驗證是怎麼進行的,決定采用個驗證模塊是由我們決定采用哪種身份驗證決定的,如Forms驗證就是用了FormsAuthenticateModule來處理的。而且還要配置web.config文件

  中的<authentication/>元素。

  下面我們就先來看看身份驗證模塊的實現(偽碼)

 public class FormsAuthenticationModule:IHttpModule 
{

        #region IHttpModule 成員

        public void Dispose()
        {
                throw new NotImplementedException();
        }

        public void Init(HttpApplication context)
        {
                context.AuthenticateRequest += new EventHandler(context_AuthenticateRequest);
        }

  public event FormsAuthenticationEventHandler Authenticate;

        #endregion
}
 
大家可以看到,其實在模塊的Init方法中就訂閱了AuthenticateRequest事件,而我們在Global.asax中寫的代碼就是我們具體處理的代碼:

 void context_AuthenticateRequest(object sender, EventArgs e)
        {
                //自定義驗證代碼
        }

  還有一點要注意的就是:每個模塊都有一個Authenticate事件。

  下面就說說常用的兩個個驗證模塊,因為大同小異:

  WindowsAuthenticateModule:

  WindowsAuthenticateModule是和IIS身份驗證聯合試用的,當web.config 的中配置如下:

  <authentication
mode="Windows"/>

  此時,這個模塊就激活了,在Global.asax文件中就的Application_Authenticate(object sender,eventArgs e)就是給Windows驗證用的。

  這裡有一個問題要澄清:如果是我們配置的是Windows身份驗證,我們在Application_Authenticate中就只能寫和Windows身份驗證有關的代碼,如果是配置的是Forms驗證,我們在Application_Authenticate就只能寫和Forms有關的代碼,如獲取cookIE信息等。也就是說,Application_Authenticate方法是"一法多用"。

  接著談 Windows驗證,在上面的處理程序中,我們可以創建自己的用戶信息,如我們創建一個WindowsPrincipal類的實例(實現了IPrincipal接口,包含用戶名和角色的信息),然後它賦值給 HttpContext.User屬性。這正如我們之前說的,驗證事件執行完之後,我們就知道了這個請求的發起者的用戶名和角色信息。

  FormsAuthenticateModule:

  首先還是要配置:<authentication mode="Forms"/>.

FormsAuthenticateModule可以利用cookie解析保存在cookIE中的用戶的信息,並且創建一個GenericPrincipal,把用戶名和角色信息保存在其中,然後賦值給User屬性,以備後用。

  3.授權模塊

  在ASP.Net中內置的授權模塊主要有兩個:FileAuthorizationModule和UrlAuthorizationModule。他們也實現了IHttpModule接口。這些模塊可以參照所試用的身份驗證類型來決定到底采用哪個授權模塊:

  如果試用的是Windows身份驗證,那麼在授權檢查的時候就會使用FileAuthorizationModule;

  如果在web.config中提供了<authorization/>元素,那麼就會采用UrlAuthorizationModule。如下面的:

 <authorization>
        <allow roles ="" users=""/>
        <deny users=""/>
     </authorization>

  FileAuthorizationModule:

  如果使用 Windows身份驗證,就會采用FileAuthorizationModule模塊。這個模塊可以處理Authorization事件,並且能夠對IIS提供的請求的令牌和目標資源執行訪問檢查。而且這也用到了系統的ACL(訪問控制列表).

  例 如,如果請求的資源是Default.aspx,當前的用戶是xiaoyang,那麼FileAuthorizationModule就會執行訪問檢查,看看xiaoyang時候具備訪問Default.ASPx的讀的權限,如果在Windows的用戶賬戶中有xiaoyang這個賬戶,並且具有訪問的權限,那麼請求成功,否則,FileAuthorizationModule就把Reponse.StatusCode設置為401(未授權),之後請求就結束了。

  UrlAuthorizationModule:

  和上面的處理模塊不一樣,不管使用何種類型的身份驗證,只要配置了web.config中的<authorization/>元素,就要使用UrlAuthorizationModule模塊。這個模塊在處理的時候執行如下:


  1,把<authorization/>中聲明的用戶名和HttpContext.User.Identity進行比較

  2.把<authorization/>聲明的角色信息和HttpContext.User.IsInRole比較

  如果比較成功就可以訪問相應的授權的資源,否則把Reponse.StatusCode設置為401(未授權),之後請求就結束了。

  今天就到這裡,下篇我們詳細談談Forms驗證和授權的各種細節。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved