2013-02-19 69 views
1

Here's a post有關用於抑制某些請求的表單身份驗證的模塊。我們的想法是,該模塊是註冊在web.config文件等的每一個請求它的Init()被調用:該模塊用於抑制表單身份驗證應該如何工作?

public void Init(HttpApplication context) { 
    context.PostReleaseRequestState += OnPostReleaseRequestState; 
    context.EndRequest += OnEndRequest; 
} 

那麼一旦請求已接近IIS流水線的末端,EndRequest事件觸發,因此該代碼引用:

private void OnEndRequest(object source, EventArgs args) { 
    var context = (HttpApplication)source; 
    var response = context.Response; 

    if (context.Context.Items.Contains(SuppressAuthenticationKey)) { 
     response.TrySkipIisCustomErrors = true; 
     response.ClearContent(); 
     response.StatusCode = 401; 
     response.RedirectLocation = null; 
    } 
} 

代碼的其他部分較早調用,保證SuppressAuthenticationKeycontext.Context.Items設置。

現在我已經得到了IIS源(它們可用於研究)和還有的FormsAuthenticationModule的實現,它贊同EndRequest和該請求的處理程序盡職盡責地重定向與HTTP 401代碼結束的所有請求。

不僅我看到代碼,而且我看到它的工作方式。沒有任何數量的.RedirectLocation = null對此有任何影響。

如果重定向在IIS中不可執行,該代碼應該如何抑制表單身份驗證重定向?

+0

我沒有遇到過這個特殊的問題 - 雖然很有趣。不完全確定這是否有用或有幫助,但已發現這種屬性,暗示在某些情況下允許/可用/可能/需要抑制被允許/可用/ http://msdn.microsoft.com/en-us/library/system.web.httpresponse .suppressformsauthenticationredirect.aspx您正在檢查哪個版本的IIS資源,或許它只在IIS 7.5或8中受支持,儘管我只是猜測? – bUKaneer 2013-02-19 11:22:35

+0

@bUKaneer:你提到的屬性出現在.NET4.5開始,我正在評估版本4,所以它尚不可用。 – sharptooth 2013-02-19 11:40:22

+0

@bUKaneer:神祕解決了。 – sharptooth 2013-02-20 05:15:21

回答

1

原來,這是這個東西應該如何工作。

EndRequest第一次觸發FormsAuthenticationModule及其事件handers設置了重定向,但重定向不是立即執行的,實際效果是它只是在響應中放置HTTP 302和重定向URL,請求處理繼續。然後EndRequest觸發抑制模塊和抑制模塊清除之前設置的重定向,就像從未設置過一樣。

因此,請求處理繼續,就好像沒有重定向一樣。