【问题标题】:Who sets the IsAuthenticated property of the HttpContext.User.Identity谁设置了 HttpContext.User.Identity 的 IsAuthenticated 属性
【发布时间】:2011-12-28 19:48:18
【问题描述】:

此代码来自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 为 FALSE

你能确认一下吗?

【问题讨论】:

    标签: asp.net-mvc authentication forms-authentication


    【解决方案1】:

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

    【讨论】:

    • 没有源链接,但判断您的其他 asp.net mvc 解决方案我发现您是专家 ;-) 我喜欢上面的解释以及许多人不理解的后续请求/发现谷歌搜索寻求帮助同样的话题。
    • @DarinDimitrov 如果响应写入正确的 cookie,其中包括成功验证后的 FormAuthentication 票证。 asp.net 将从请求中读取并解析它。它将确定IsAuthenticated 是否为真。有什么问题请指正。谢谢。
    【解决方案2】:

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

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

    这是有道理的,因为FormsAuthenticationModule.cs 中的代码仅在身份验证后分配FormsIdentity。代码看起来很复杂,我看到它从 cookie 中提取票证,但我找不到它在哪里验证票证。

    【讨论】:

    • 抱歉,Andomar 我没有写关于表单身份验证的全部内容。我编辑了我的问题。
    • 到目前为止我在谷歌中读到的内容,经过一些测试,需要设置 FormsAuthentication.SetAuthCookie 以使 IsAuthenticated 返回 true。使用 var isAuthenticated = base.AuthorizeCore(httpContext);在我重写的 AuthorizeCore 方法中。实际上它应该被称为 AuthenticateCore 但那是另一个故事。如果有人有 Microsoft 链接/证明,无论是什么使 IsAuthenticated 跳转切换为 true,我都会很高兴并将其标记为解决方案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 2018-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多