1

我在表单身份验证方面遇到了一个奇怪的问题。我有自己的自定义主体和身份类,登录后我将 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 处理程序中设置的主体被替换?

4

1 回答 1

-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; 
    } 
} 
于 2012-04-05T14:44:46.863 回答