我有一個表單身份驗證奇怪的問題。我有我自己的自定義主體和身份類,並且在登錄後,我將HttpContext.Current.User設置爲該主體,並將其存儲在緩存(HttpContext.Current.Cache)中。似乎過了一段時間,奇怪的行爲開始了。這是我的AuthenticateRequest處理程序:Asp.net Forms身份驗證 - 主要更改?
protected void Application_AuthenticateRequest(object sender, EventArgs e) {
string userName;
var formAuthCookie = HttpContext.Current.Request.Cookies[ FormsAuthentication.FormsCookieName ];
var isAuthenticated = HttpContext.Current.Request.IsAuthenticated;
if (isAuthenticated || formAuthCookie != null) {
if (!isAuthenticated) {
var ticket = FormsAuthentication.Decrypt(formAuthCookie.Value);
userName = ticket.Name;
}
else {
userName = HttpContext.Current.User.Identity.Name;
}
var prin = (IPrincipal)HttpContext.Current.Cache[ userName ];
if (prin != null) {
HttpContext.Current.User = prin;
}
}
}
這總是正常工作;自定義主體將從緩存中拉出並正確設置到當前上下文的用戶。
問題是,當我到達頁面加載時,Page.User屬性具有GenericPrincipal(沒有角色)和FormsIdentity。我不知道這發生了什麼。當然這個頁面不起作用,因爲這個用戶並沒有扮演適當的角色,儘管FormsAuth讓他們進入了一個角色受限制的頁面。
任何想法爲什麼我在AuthenticateRequest處理程序中設置的princpal被替換?
是FormsAuthentication是基於cookie你一定要明白,而緩存的AppDomain基礎,這意味着每次應用程序域recyles,一切很失落... – 2012-04-05 01:59:37
應用程序池是不是會回收。其實你提醒我,回收應用程序池似乎糾正了一點問題。 Cookie設置爲與會話同時過期。問題不在於緩存丟失,因爲我可以跟蹤上面的代碼並看到正確的主體被取出,並且幾秒鐘後在page_load中有一個不同的主體。 – Andy 2012-04-05 02:04:09
您不應該將該會話設置爲與表單身份驗證cookie同時過期。 http://completedevelopment.blogspot.com/2009/12/caution-with-using-sessiontimeout-and.html – 2012-04-05 02:10:19