2010-08-23 27 views
4

我在Global.asax中使用Application_OnAuthenticateRequest將自定義主體分配給HttpContext.Current.User和System.Threading.Thread.CurrentPrincipal。
在測試中,我注意到這個代碼對單個頁面請求執行多次。通過查看HttpContext.Current.Request.Url,我確定此代碼正在爲每個JavaScript文件,Image和CSS文件的調用執行。所有這些資源都存儲在稱爲「內容」的單個子文件夾中。所以,我能夠阻止我的自定義主要的多次執行通過檢查,看看是否「內容」是HttpContext.Current.Request.Url的一部分,就像這樣:Application_OnAuthenticateRequest對圖像請求執行

protected void Application_OnAuthenticateRequest(Object sender, EventArgs e) 
{ 
    if (HttpContext.Current.Request.Url.AbsoluteUri.Contains("/Content")) 
     return; 

    if (Context.User != null) 
    { 
     if (Context.User.Identity.IsAuthenticated) 
     { 
      var userRepository = ObjectFactory.GetInstance<IUserRepository>(); 

      var prospectorUser = userRepository.GetByUserName(Context.User.Identity.Name); 

      if (prospectorUser == null) 
      { 
       throw new ApplicationException("Context.User.Identity.Name is not a recognised user."); 
      } 

      var principal = new ExtendedWindowsPrincipal(HttpContext.Current.User.Identity, prospectorUser); 

      // Attach the new principal object to the current HttpContext object 
      HttpContext.Current.User = principal; 
      // Make sure the Principal's are in sync 
      System.Threading.Thread.CurrentPrincipal = HttpContext.Current.User; 
      return; 
     } 
    } 
} 

我修復似乎缺憾。有沒有更好的方法來捕獲「內容」項目的請求,並阻止我的委託人的自定義代碼針對每個請求解僱?

回答

0

AuthenticateRequest事件發生在HTTP管道相當高了。如果你想在某些情況下爲你的應用程序繞過它,你可能需要編寫一個HttpModule,它被註冊來處理給定的路徑。

請看下面的文章中的圖9,10和11。您應該可以按照它來構建自定義模塊來處理對內容路徑的請求,並繞過所有常規事件處理。

Securely Implement Request Processing, Filtering, and Content Redirection with HTTP Pipelines in ASP.NET

+0

我對這種方法的初步嘗試最終阻止了將Content文件夾中的資源下載到客戶端。所以,沒有圖像,CSS,腳本等。我創建了一個攔截請求的httpModule。如果請求中包含uri中的「內容」,那麼我完成了請求並將響應代碼設置爲200,但沒有任何資源正在發送到客戶端。 – 2010-08-23 19:37:38

+0

您可能無法完成請求 - 您仍然需要將請求傳遞給將發送內容的IHttpHandler,或者手動自行發送文件。 – womp 2010-08-23 20:37:15

0

簡單的答案是修改你的web.config,使「內容」文件夾匿名訪問:

<location path="Content"> 
    <system.web> 
     <authorization> 
      <allow users ="*" /> 
     </authorization> 
    </system.web> 
</location> 
+1

我認爲這太開始,但我的直覺是,AuthenticateRequest仍在繼續開火,因此執行他的雜牌。雖然會喜歡一些確認。 – womp 2010-08-23 18:34:57

+0

應該只需要一分鐘測試... – Scrappydog 2010-08-23 18:40:11

+1

我註釋了我的Application_OnAuthenticateRequest中的「內容」檢查,然後將 ..添加到我的web.config中,但它沒有什麼區別。我的主要代碼將觸發所有與內容相關的請求。 – 2010-08-23 19:11:59