【问题标题】:Why is User.Identity null after Membership.ValidateUser returns true?为什么 Membership.ValidateUser 返回 true 后 User.Identity 为空?
【发布时间】:2014-05-28 05:00:46
【问题描述】:

不幸的是,在 MVC5 的日子里,我不得不与 MembershipProvider 打交道。但这是让我困惑的问题。

在我的 MVC 应用程序中,登录视图将用户名和密码发送回登录控制器。

    [HttpPost]
    public ActionResult Login(LoginInputModel model)
    {   
        var isValid = Membership.ValidateUser(model.Username, model.Password);
        var user = Membership.GetUser(model.Username);
        var isAuthenticated = User.Identity.IsAuthenticated;
        var username = User.Identity.Name;
        ...
    }

进入控制器,我找到了

  • isValidtrue,这很好。
  • user 也会返回正确的信息。

但是

  • isAuthenticatedfalse
  • User.Identity 仍然是 null

我一直认为Membership.ValidateUser() 会用正确的信息填充 User.Identity`。现在似乎缺少了一些东西。谁能告诉我出了什么问题?

谢谢。

【问题讨论】:

  • 嗯,如果User.Identity null,那么User.Identity.IsAuthenticated(用来查找isAuthenticated)会抛出异常,不是吗?

标签: asp.net-mvc membership-provider asp.net-mvc-5.1


【解决方案1】:

这是我的临时解决方法:

灵感来自here

我加了一句:

if (user != null) FormsAuthentication.SetAuthCookie(user.UserName, true);

它似乎正在工作。但我不确定这是否是正确的方法。

【讨论】:

    【解决方案2】:

    在下一个请求之前不会填充用户对象。用户是尚未更新的 HttpContext 的一部分。

    看到您没有使用 WebSecurity(这里会很好),您必须在验证后设置 auth cookie。

    if(Membership.ValidateUser(model.Username, model.Password))
    {
         FormsAuthentication.SetAuthCookie(user.UserName, true);
         //Any other logic you need to perform
    } 
    else
    {
         //Handle invalid login details
    }
    

    【讨论】:

    • 感谢您的快速回复。我认为你指向正确的方向。但是如何在HttpContext 中更新User
    • 我有点误读了你的代码。您需要 SetAuthCookie 才能使其工作。 ValidateUser 仅检查用户名/密码组合是否正确。然后,您需要设置身份验证 cookie。我已经更新了我的答案。另一种选择是使用 WebSecurity.Login 为您处理所有这些。
    猜你喜欢
    • 1970-01-01
    • 2015-07-25
    • 2011-05-22
    • 2016-04-25
    • 1970-01-01
    • 2014-09-25
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    相关资源
    最近更新 更多