熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP.NET中的HTTP模塊和處理程序(下)

2013-11-13 10:09:17  來源: .NET編程 

  在配置文件中注冊HTTP模塊 
   
  當我們建立了HTTP模塊並把它復制到Web應用程序的bin目錄或者全局部件緩沖(Global Assembly Cache)之後接下來就應該在nfig或nfig中注冊它了 
   
  我們可以使用<httpModules>和<add>節點把HTTP模塊添加到Web應用程序中實際上模塊都使用<add>節點列舉在<httpModules>和</httpModules>節點之內了 
   
  因為配置設置信息是可以繼承的所以子目錄從父目錄那兒繼承配置設置信息其結果是子目錄可能繼承了一些不需要的HTTP模塊(它們是父配置信息的一部分)因此我們需要一種刪除這些不需要的模塊的方法我們可以使用<remove>節點如果我們希望刪除從應用程序繼承得到的所有HTTP模塊可以使用<clear>節點 
   
  下面的代碼是添加HTTP模塊的一個通用示例
  
  <httpModules>
  <add type=classname assemblyname name=modulename />
  <httpModules> 
   
  下面的代碼是從應用程序中刪除HTTP模塊的一個通用示例
  
  <httpModules>
  <remove name=modulename />
  <httpModules> 
   
  在上面的XML中 
   
  · Type屬性用類和部件名稱的形式指定了HTTP模塊的實際類型 
   
  · Name屬性指定了模塊的友好名稱其它應用程序可以使用這個名稱來識別HTTP模塊 
   
  ASPNET運行時如何使用HTTP模塊 
   
  ASPNET運行時使用HTTP模塊實現某些特殊的功能下面的片段來自於nfig文件它顯示了ASPNET運行時安裝的HTTP模塊
  
  <httpModules>
   <add name=OutputCache type=SystemWebCachingOutputCacheModule/>
   <add name=Session type=SystemWebSessionStateSessionStateModule/>
   <add name=WindowsAuthentication
  type=SystemWebSecurityWindowsAuthenticationModule/>
   <add name=FormsAuthentication
  type=SystemWebSecurityFormsAuthenticationModule/>
   <add name=PassportAuthentication
  type=SystemWebSecurityPassportAuthenticationModule/>
   <add name=UrlAuthorization
  type=SystemWebSecurityUrlAuthorizationModule/>
   <add name=FileAuthorization
  type=SystemWebSecurityFileAuthorizationModule/>
  </httpModules> 
   
  ASPNET使用上面一些HTTP模塊來提供一些服務例如身份驗證和授權對話管理和輸出緩沖由於這些模塊都注冊在nfig文件中

  實現一個提供安全服務的HTTP模塊 
   
  現在我們實現一個HTTP模塊它為我們的Web應用程序提供安全服務該HTTP模塊基本上是提供一種定制的身份認證服務它將接收HTTP請求中的身份憑證並確定該憑證是否有效如果有效與用戶相關的角色是什麼?通過UserIdentity對象它把這些角色與訪問我們的Web應用程序頁面的用戶的標識關聯起來 

  下面是該HTTP模塊的代碼
  
  using System;
  using SystemWeb;
  using SystemSecurityPrincipal;
  
  namespace SecurityModules
  {
   /// Class的總體描述
  
   public class CustomAuthenticationModule : IHttpModule
   {
    public CustomAuthenticationModule()
    {
    }
    public void Init(HttpApplication r_objApplication)
    {
     // 向Application 對象注冊事件處理程序
     r_objApplicationAuthenticateRequest +=
  new EventHandler(thisAuthenticateRequest) ;
    }
  
    public void Dispose()
    {
     // 此處空出因為我們不需要做什麼操作
    }
  
    private void AuthenticateRequest(object r_objSenderEventArgs r_objEventArgs)
    {
     // 鑒別用戶的憑證並找出用戶角色
      HttpApplication objApp = (HttpApplication) r_objSender ;
      HttpContext objContext = (HttpContext) objAppContext ;
      if ( (objAppRequest[userid] == null) ||
       (objAppRequest[password] == null) )
       {
        objContextResponseWrite(<H>Credentials not provided</H) ;
        objContextResponseEnd() ;
       }
  
      string userid = ;
      userid = objAppRequest[userid]ToString() ;
      string password = ;
      password = objAppRequest[password]ToString() ;
   
      string[] strRoles ;
      strRoles = AuthenticateAndGetRoles(userid password) ;
      if ((strRoles == null) || (strRolesGetLength() == ))
      {
       objContextResponseWrite(<H>We are sorry but we could not
  find this user id and password in our database</H) ;
       objAppCompleteRequest() ;
      }
  
      GenericIdentity objIdentity = new GenericIdentity(userid
  CustomAuthentication) ;
      objContextUser = new GenericPrincipal(objIdentity strRoles) ;
    }
  
    private string[] AuthenticateAndGetRoles(string r_strUserIDstring r_strPassword)
    {
     string[] strRoles = null ;
     if ((r_strUserIDEquals(Steve)) && (r_strPasswordEquals(seconds)))
     {
      strRoles = new String[] ;
      strRoles[] = Administrator ;
     }
     else if ((r_strUserIDEquals(Mansoor)) && (r_strPasswordEquals(mas)))
     {
      strRoles = new string[] ;
      strRoles[] = User ;
     }
     return strRoles ;
    }
   }
  } 
   
  我們研究一下上面的代碼 
   
  我們是從Init函數開始的這個函數把處理程序的AuthenticateRequest事件插入Application(應用程序)對象的事件處理程序列表中這將導致引發AuthenticationRequest事件的時候Application調用該方法 
   
  我們的HTTP模塊初始化之後我們就可以調用它的AuthenticateRequest方法來鑒別客戶端請求AuthenticateRequest方法是該安全/身份認證機制的核心在這個函數中 
   
  行提取HttpApplication和HttpContext對象行檢測是否沒有給我們提供了用戶id或密碼如果沒有提供就顯示錯誤信息請求處理過程終止 
   
   行從HttpRequest對象中提取用戶id和密碼 
   
  行調用一個叫做AuthenticateAndGetRoles的輔助(helper)函數這個函數主要執行身份驗證並決定用戶角色上面的代碼采用了硬編碼(hardcoded)只允許兩個用戶使用但是我們可以擴展這個方法並添加代碼與用戶數據庫交互操作並檢索用戶的角色 
   
  行檢測是否有角色與用戶關聯如果沒有就意味著傳遞給我們的憑證沒有通過驗證因此該憑證是無效的因此給客戶端發送一個錯誤信息並且請求結束了 
   
  行非常重要因為這兩行實際上告訴ASPNET HTTP運行時已登錄用戶的身份這兩行成功執行以後我們的aspx頁面就能夠使用User對象訪問這些信息了 
   
  現在我們看一看這種身份驗證機制的運行情況目前我們只允許下面兩個用戶登錄到系統
  
    · User id = Steve Password = seconds Role = Administrator
    · User id = Mansoor Password = mas Role = User 
   
  注意用戶id和密碼是大小寫敏感的(區分大小寫) 
   
  首先試圖不提供憑證登錄系統在IE中輸入x將看到下面的消息 
 

  

  現在試圖使用用戶idSteve和密碼seconds登錄系統輸入 x?userid=Steve&password=seconds你將看到下面的歡迎消息

  

  現在試圖使用用戶idMansoor和秘碼mas登錄系統輸入x?userid=Mansoor&password=mas你將看到下面的歡迎消息頁面

  

  現在試圖使用錯誤的用戶id和密碼組合來登錄系統輸入x?userid=Mansoor&password=xyz你將看到下面的錯誤消息

  

  這表明我們的安全模塊在起作用了你可以通過在AuthenticateAndGetRoles方法中使用數據庫訪問代碼來擴展該安全模塊
   
  要使所有的部分都起作用我們必須對nfig文件進行一些修改首先由於我們要使用自己的身份驗證因此不需要其它的身份驗證機制為了達到這個目的改變webapp的nfig文件中的<authentication>節點如下所示
  
  <authentication mode=None/> 
   
  類似地不允許匿名用戶訪問我們的Web站點給nfig文件添加下面的語句
  
  <authorization>
   <deny users=?/>
  </authorization> 
   
  用於至少能夠匿名訪問用於提供憑證的文件在nfig文件中使用下面的配置設置信息把indexaspx作為唯一能夠匿名訪問的文件
  
  <location path=indexaspx
   <systemweb>
    <authorization>
     <allow users=*/>
    </authorization>
   </systemweb>
  </location>
  
    結論 
   
  你可能已經意識到有了HTTP處理程序和模塊後ASPNET已經給開發者提供了強大的能量把你自己的組件插入ASPNET請求處理管道享受它的優點吧 
   
  作為練習你應該進一步改進程序使示例身份驗證模塊更加靈活並能根據用戶的需要進行調整


From:http://tw.wingwit.com/Article/program/net/201311/12722.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.