2012-04-05 114 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