2012-12-11 70 views
7

我有我自己的身份驗證系統(https://bitbucket.org/anton_gogolev/octalforty-structural),它不使用任何標準的ASP.NET東西(<authentication mode="None" />)。ASP.NET MVC中完全自定義身份驗證:失去HttpContext.User

它使用普通IHttpModule s到做的工作:BeginRequest檢查傳入的cookie,並設置HttpContext.Current.UserThread.CurrentPrincipal,認證成功後

Thread.CurrentPrincipal = HttpContext.Current.User = 
    new GenericPrincipal(tokenIdentity,new string[] { }); 

EndRequest問題所需的所有cookie進行身份驗證的用戶。

這一直是個做工精細了,但在某些系統上(我真的不能告訴如何從那些其實這上工作他們不同)ASP.NET似乎正在失去的HttpContext.Current.User價值,取代它無論默認值如何(GenericPrincipal彙總GenericIdentityIsAuthenticated設置爲false等)。

所以問題是:HttpContext.Current.User如何以及爲什麼會迷路?

+0

我遇到同樣的問題。任何解決方案 –

+0

有關症狀的更多詳情?這是發生在一個用戶還是多個用戶?在受影響的系統中,是否每次或僅在某些時間丟失用戶,以及是否僅在某些時間丟失用戶多久? –

回答

2

聽起來好像還有另一個模塊在BeginRequest之後修改HttpContext.Current.User。我建議在PostAuthenticateRequest中設置它。

我以前有過使用ASP.NET啓用RoleManager模塊的問題。將以下內容添加到web.config的system.web部分中修復了它。

<httpModules> 
    <remove name="RoleManager"/> 
</httpModules> 

這裏是我所做的解決這個問題的一些放大信息:

1)弄清楚什麼其他模塊運行。這裏有一個article,它提供了一些代碼。

2)確保你在正確的地方設置了HttpContext.Current.User。 BeginRequest不是一個好地方。PostAuthenticateRequest通常是最好的(並且是推薦的)。如果另一個模塊也在使用PostAuthenticateRequest並且它恰好在你的後面運行,這不會阻止問題,但在很多情況下它會解決問題(使用上面的web.config代碼段)。

3)選擇性地禁用每個已安裝的模塊並測試您的應用程序,直到您的自定義主體對象未被覆蓋。