2012-04-05 188 views
1

我有一個表單身份驗證奇怪的問題。我有我自己的自定義主體和身份類,並且在登錄後,我將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被替換?

+0

是FormsAuthentication是基於cookie你一定要明白,而緩存的AppDomain基礎,這意味着每次應用程序域recyles,一切很失落... – 2012-04-05 01:59:37

+0

應用程序池是不是會回收。其實你提醒我,回收應用程序池似乎糾正了一點問題。 Cookie設置爲與會話同時過期。問題不在於緩存丟失,因爲我可以跟蹤上面的代碼並看到正確的主體被取出,並且幾秒鐘後在page_load中有一個不同的主體。 – Andy 2012-04-05 02:04:09

+0

您不應該將該會話設置爲與表單身份驗證cookie同時過期。 http://completedevelopment.blogspot.com/2009/12/caution-with-using-sessiontimeout-and.html – 2012-04-05 02:10:19

回答

-1

試試這個:

var formAuthCookie = Context.Request.Cookies[ FormsAuthentication.FormsCookieName ]; 
var isAuthenticated = Context.Request.IsAuthenticated; 

if (isAuthenticated || formAuthCookie != null) { 
    if (!isAuthenticated) { 
     var ticket = FormsAuthentication.Decrypt(formAuthCookie.Value); 
     userName = ticket.Name; 
    } 
    else { 
     userName = Context.User.Identity.Name; 
    } 

    var prin = (IPrincipal)Context.Cache[ userName ]; 

    if (prin != null) { 
     Context.User = prin; 
    } 
} 
+0

你能突出這個和我有什麼區別嗎? – Andy 2012-04-05 18:43:29

+0

@Andy - 這是一個很小的代碼塊,變化很明顯。您只需將HttpContext.Current。*更改爲Context。* – 2012-04-05 19:27:55

+0

這沒有什麼區別。 – bang 2012-07-11 01:02:36