我有一个表单身份验证奇怪的问题。我有我自己的自定义主体和身份类,并且在登录后,我将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