39


AuthenticateRequest事件

Q 1.我的理解FormsAuthenticationModule訂閱到AuthenticateRequest事件,因此僅此事件被觸發後,是FormsAuthenticationModule調用。但接下來的行情讓我有點糊塗:

  1. 所配置的驗證機制已經認證了當前請求的AuthenticateRequest事件信號。

    • 沒有以上報價表明,在引發AuthenticateRequest事件,請求(也稱爲用戶)已經驗證?
  2. 訂閱所述事件AuthenticateRequest確保該請求將處理所述附加模塊或事件處理程序之前進行認證。

    • 據我理解這句話,如果我們訂閱AuthenticatedRequest,那麼我們的事件處理程序將先於FormsAuthenticationModule叫什麼?因此在調用FormsAuthenticationModule之前調用Application_AuthenticateRequest()


Q 2本書,我從提示中Application_AuthenticateRequest()我們能夠驗證用戶是否是特定角色的成員,如果沒有,我們可以添加用戶學習自動:

protected void Application_AuthenticateRequest(Object sender, EventArgs e) 
    { 
      if (User.Identity.IsAuthenticated && Roles.Enabled) 
      { 

       //here we can subscribe user to a role via Roles.AddUserToRole() 
      }  
    } 

從上面的代碼來看,Application_AuthenticateRequest()FormsAuthenticationModule後已被調用調用,但其他地方同樣的書意味着Application_AuthenticateRequest()是前FormsAuthenticationModule叫:

Application_AuthenticateRequest進行身份驗證之前被調用。 這是創建自己的身份驗證邏輯的起點。


我缺少什麼?


感謝名單

回答

50

看來,FormsAuthenticationModule得到優先處理。此模塊通常比ASP.NET管道中的任何自定義模塊早,所以當激發AuthenticateRequest時,FormsAuthenticationModule將首先被調用,完成其工作,然後調用模塊的事件處理程序。

如果你真的想深入研究這個,我建議你自己調試ASP.NET代碼。這裏是一個後如何設置你的VS:

http://weblogs.asp.net/scottgu/archive/2008/01/16/net-framework-library-source-code-now-available.aspx

編輯:我能夠證實通過建立一個web項目在Global.asax中自定義模塊和事件處理這種行爲。看一看HttpApplication.InitInternal的源代碼,初始化的順序如下:

  • 的集成模塊初始化:FormsAuthenticationModule掛接到HttpApplication.AuthenticateRequest事件
  • 的自定義模塊初始化:定義模塊鉤高達HttpApplication.AuthenticateRequest事件
  • 全球類(Global.asax中)的初始化:在這裏我們掛接到AuthenticateRequest事件
  • HttpApplication.InitInternal針對特定名稱模式下全球一流的搜索方法(如Application_AuthenticateRequest ),他們一致事件和勾搭

初始化之後,當AuthenticateRequest火災,事件處理程序被稱爲在他們那裏初始化的順序,所以:

  • FormsAuthenticationModule.AuthenticateRequest事件處理
  • CustomModule.AuthenticateRequest事件處理程序
  • Global.AuthenticateRequest事件處理程序
  • Global.Application_AuthenticateRequest方法

除非我錯過了某些東西,沒有機制來阻止事件處理程序的觸發,所以無論FormsAuthenticationModule.AuthenticateRequest的結果如何,下一個處理程序仍將被調用。我希望有所幫助。

+0

Q1如果我理解正確的話,那麼當AuthenticateRequest火災,FormsAuthenticationModule首先被調用,然後Application_AuthenticateRequest(),然後才進行定製認證模塊被稱爲? Q2 - 但MSDN報價(「AuthenticateRequest事件表明配置的認證機制已認證當前請求」),這意味着AuthenticateRequest僅在FormsAuthenticationModule完成其工作後纔會觸發? – SourceC 2009-05-17 22:10:03

+1

該文章中的詳細答案。關於Q2 - 我想這不是完全正確的:「AuthenticateRequest事件表明配置的認證機制已經認證了當前的請求」 - 它肯定會通過FormsAuthenticationModule上的事件處理程序,但我們不知道結果;) – bbmud 2009-05-17 23:10:20

+1

thanx。你真的幫我解決了這個問題 – SourceC 2009-05-18 00:09:46

5

如果你想訪問用戶對象,我建議你使用

protected void Application_Start() 
{ 
    PostAuthenticateRequest += Application_PostAuthenticateRequest; 
} 

protected void Application_PostAuthenticateRequest(object sender, EventArgs e) 
{ 
    if(User.Identity.IsAuthenticated) 
    { 
     //Do stuff here 
    } 
}