2011-02-03 46 views
4

我試圖在.NET MVC網站中實現自定義主體和自定義標識。我創建了一個繼承自IPrincipal的自定義主體類和一個繼承自IIdentity的自定義標識。自定義委託人在新請求中恢復爲GenericPrincipal

當用戶登錄時,我將Thread.CurrentPrincipal和HttpContext.Current.User都設置爲我的自定義主體。當我通過調試器查看時,所有的屬性都設置了值。

但是,一旦請求完成,我嘗試請求任何其他頁面,Thread.CurrentPrincipal和HttpContext.Current.User的類型是System.Security.Principal.GenericPrincipal,而不是我的自定義主體。

我是否需要做任何「額外」來讓我的自定義主體脫離線程或HttpContext?

由於

回答

6

的值在Thread.CurrentPrincipalHttpContext.Current.User不請求之間依然存在,它們都將被重建對每個請求。你做這件事的最好的地方可能在於Global.asax;寫一個函數原型:

void Application_PostAuthenticateRequest(object sender, EventArgs e) 

用戶對每個請求驗證之後,應該讓調用,這將允許您設置主,你怎麼想。

0

Overridding主要在:

protected void Application_PostAuthenticateRequest(object sender, EventArgs e) 

而不是

protected void Application_AuthenticateRequest(object sender, EventArgs e) 

在Global.asax.cs中在ASP Web應用程序爲我工作

0

我想在接受擴大稍微回答,希望我可以節省一些時間。

就我而言,我使用的委託人包含從外部服務的結果填充的聲明,所以我想在登錄時緩存結果。

我創建了一個簡單的高速緩存接口,IUserPrincipalCache,並將其註冊到MVC DependencyResolver。在登錄時,我建立了委託人並將其添加到緩存中。 (因爲你的執行可能會有所不同,我會離開這一切,。)

然後我實現了這個在Global.asax.cs

protected void Application_PostAuthenticateRequest(object sender, EventArgs e) 
{ 
    if (User.Identity.IsAuthenticated) 
    { 
     var cache = DependencyResolver.Current.GetService<IUserPrincipalCache>(); 
     var claimsPrincipal = cache.FindUser(User.Identity.Name); 
     if (claimsPrincipal != null) 
     { 
      Context.User = claimsPrincipal; 
      Thread.CurrentPrincipal = claimsPrincipal; 
     } 
    } 
} 

我想指出的支票IsAuthenticated是很重要的,因爲我可以在許多情況下繞過緩存檢查。你也可能不需要更新Thread.CurrentPrincipal,我想這取決於你如何使用它。