4

我有一个asp.net mvc 4Web 应用程序,其中有一个自定义身份验证 cookie,其中包含加密的用户信息。在我的 Global.asax.cs 中,我解密 cookie,创建自定义身份和主体,并将其设置在上下文中。这一切都适用于运行 IIS 7.5 的本地计算机,但是当我使用 IIS 8 发布到我的暂存设置时,自定义主体不会停留在上下文中。这是我的代码的要点

代码示例

protected void Application_BeginRequest(object sender, EventArgs e)
{
    AuthenticateRequest(HttpContext.Current);
}

public virtual void AuthenticateRequest(HttpContext context)
{
    var cookie = context.Request.Cookies[FormsAuthentication.FormsCookieName];
    if (cookie == null || string.IsNullOrWhiteSpace(cookie.Value))
    {
        return;
    }

    var rawJson = DecryptAuthCookie(cookie.value);
    var stub = AuthenticationStub.FromString(rawJson);

    var context = HttpContext.Current;

    var identity = new CustomIdentity(stub.Username, stub.FirstName, 
                          stub.LastName, stub.Email, stub.UserId, stub.UserType);

    var principal = new CustomPrincipal(identity);

    context.User = principal;
}

此时我可以附加一个远程调试器并查看所有设置是否正确。context.User是一个CustomPrincipal

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {   
        // httpContext.User is a 
        // System.Security.Principal.GenericPrincipal not CustomPrincipal 
        return base.AuthorizeCore(httpContext);
    }
}

当我到达这里时,我可以看到这httpContext.User不是System.Security.Principal.GenericPrincipalCustomPrincipal发生在 IIS 8 机器上,当我在本地运行它时,它CustomPrincipal符合预期。

介于两者之间AuthenticateRequest,我CustomAuthorizeAttribute的自定义主体被消灭了,我不知道为什么。

有人对这个有经验么?我所拥有的只是疯狂的猜测。

4

1 回答 1

3

您不知道的是,您正在与其他 HttpModule 战斗。尝试将您的代码从 AuthenticateRequest 移动到 PostAuthenticateRequest。

于 2013-10-31T15:59:36.280 回答