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

时间:2011-12-28 19:48:18

标签: asp.net-mvc authentication 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;
        }
    }

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

FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);

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

User.Identity.IsAuthenticated

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

User.Identity.IsAuthenticated

说真的。那么谁将此属性设置为TRUE和WHEN?

更新

这是关于 FORMS 身份验证!

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

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

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

你能证实吗?

2 个答案:

答案 0 :(得分:23)

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

答案 1 :(得分:1)

属性的来源取决于Identity的类型。对于FormsIdentity,该属性只返回true:

/// <devdoc>
///    Indicates whether or not authentication took
///    place.
/// </devdoc> 
public  bool                         IsAuthenticated { get { return true;}}

这是有道理的,因为FormsAuthenticationModule.cs中的代码仅在身份验证后指定FormsIdentity。代码看起来相当复杂,我看到它从cookie中提取票证,但我找不到它验证票证的位置。