2009-12-08 25 views
1

我有一個HTTPModule做一些基於角色的頁面訪問安全性(我不得不將一些安全性改進到我們已經獲得的一些代碼中)。爲什麼我的HTTPModule中的AcquireRequestState不會觸發_sometimes_?

我注意到,在一個實例中,它不會在Server.Transfer上觸發。

這裏的代碼片段:

 ' move to target page 
    Select Case eTransferMethod 
     Case TargetPageTransferMethod.Redirect 
      Page.Response.Redirect(strPage, False) 
     Case TargetPageTransferMethod.Transfer 
      Context.Handler = Me 
      Page.Server.Transfer(strPage) 
     Case TargetPageTransferMethod.None 
      ' Do nothing 
    End Select 

我在這裏講的情況是TargetPageTransferMethod.Transfer情況。該頁面將成爲一個.aspx頁面。

現在我知道AcquireRequestState在此代碼中的其他Server.Transfer調用中被觸發。事實上,當點擊頁面上的按鈕時,它會在回發中被觸發。具有諷刺意味的是,我的安全代碼在轉移到此頁面時被繞過,但當點擊此頁面的取消按鈕時拒絕回發。 :eek:

我會發布代碼庫的更多細節,但它是如此複雜和蔓延,這將是一個噩夢來解釋。

所以基本上我問'什麼可能導致HTTPModule中的AcquireRequestState事件在調用Server.Transfer時不會觸發?'

回答

3

解決此問題的方法是創建一個繼承System.Web.UI.PageHandlerFactory類的自定義HttpHandler。

然後,您可以重寫在創建頁面實例時調用的GetHandler方法,這兩個方法都在Response.Redirect和Server.Transfer上。

註冊此新處理程序以使用「* .aspx」擴展名,所有頁面將自動使用新處理程序。這使您可以在Server.Transfer上執行自定義授權,也可以使用依賴注入框架(例如MS Unity)。

0

我可以理解它在回發中被調用,因爲這是來自客戶端的另一個請求,但Server.Transfer不會啓動新的請求,它會將執行從一個頁面傳輸到另一個頁面。

由於AcquireRequestState事件在ASP.NET獲取與當前請求關聯的當前狀態(例如會話狀態)時被觸發「 - 這會發生在來自瀏覽器的初始請求上,但不會發生服務器傳輸作爲服務器沒有得到另一個請求,你只是要求它處理一個不同的頁面。

一個關鍵的評論是這樣一個從HttpServerUtility.Transfer documentation

ASP.NET不驗證當前用戶被授權查看由Transfer方法提供的資源。雖然ASP.NET授權和身份驗證邏輯在調用原始資源處理程序之前運行,但ASP.NET直接調用由Transfer方法指示的處理程序,並且不會重新運行新資源的身份驗證和授權邏輯。如果您的應用程序的安全策略要求客戶端有適當的權限來訪問資源,應用程序應強制重新授權或提供自定義訪問控制機制。

+0

是的,你是對的。我剛剛重新檢查了我的概念測試網站的初始證明,並且我只能假設我在進行初始測試時喝醉了。 :( 要重新考慮這個想法,使用HTTPModule。 – user129345 2009-12-08 15:50:17

0

Server.Transfer不重新處理目標頁面的整個HTTP管道。它只是調用目標頁面的HttpHandler。正因爲如此,你不應該看到任何早期的應用事件被解僱。

+0

是的,現貨,德哦!看到上面的評論。( – user129345 2009-12-08 15:51:02

+0

有點尷尬關於這個,但我會讓斯普納的回答這個問題,因爲他也提供了一個解決方案。謝謝你的提高! – user129345 2009-12-09 08:39:54

相關問題