我在表单身份验证方面遇到了一个奇怪的问题。我有自己的自定义主体和身份类,登录后我将 HttpContext.Current.User 设置为此主体,并将其存储在缓存 (HttpContext.Current.Cache) 中。似乎经过一段时间后,奇怪的行为开始了。这是我的 AuthenticateRequest 处理程序:
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 处理程序中设置的主体被替换?