谁设置了HttpContext.User.Identity的IsAuthenticated属性

Eli*_*eth 24 authentication asp.net-mvc forms-authentication

此代码来自asp.net mvc RTM源代码

谁设置了HttpContext.User.Identity的IsAuthenticated属性?

   protected virtual bool AuthorizeCore(HttpContextBase httpContext) {
        if (httpContext == null) {
            throw new ArgumentNullException("httpContext");
        }

        IPrincipal user = httpContext.User;
        if (!user.Identity.IsAuthenticated) {
            return false;
        }
    }
Run Code Online (Sandbox Code Playgroud)

是通过调用方法设置IsAuthenticated属性(asp.net mvc 4.0示例项目):

FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
Run Code Online (Sandbox Code Playgroud)

当我在上面的FormsAuth ...方法调用之后调试asp.net mvc 4.0示例项目的LogOn方法的代码时.执行

User.Identity.IsAuthenticated
Run Code Online (Sandbox Code Playgroud)

仍然返回FALSE.只有当我调试LogOff方法时

User.Identity.IsAuthenticated
Run Code Online (Sandbox Code Playgroud)

说真的.那么谁将这个属性设置为TRUE和WHEN?

更新:

这是关于FORMS身份验证!

我现在调试了asp.net mvc示例项目的LogOn方法,并在返回LogOn操作后,调用了我重写的AuthorizeCore方法,然后IsAuthenticated属性为TRUE!

TRUE的设置是否依赖于ModelState.Value.Error集合?

如果错误集合中的count == 0,则IsAuthenticated为TRUE,否则IsAuthenticated为FALSE

你能证实吗?

Dar*_*rov 24

此属性由表单身份验证模块通过从请求中读取和解析表单身份验证cookie来设置.我把请求以粗体显示,因为我怀疑这就是你观察这种行为的原因.让我解释.当您调用FormsAuthentication.SetAuthCookie成功身份验证时,您将身份验证cookie添加到响应中.此cookie将存储在客户端浏览器中,并将在后续请求中发送.因此,只有在后续请求中才会将用户视为已通过身份验证.因此,您需要在调用SetAuthCookie方法后始终重定向.在调用此方法的请求中,您已经知道用户是否提供了正确的凭据,因此您无需检查IsAuthenticated属性.