为什么用户为空

时间:2016-04-28 13:16:18

标签: asp.net-mvc login-script

我想问一下,为什么UserId在用户登录后为空(在下面的代码中)。

OR

我需要根据用户的角色重定向用户。我需要尽可能简单。

// POST: /Account/Login
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }

        // This doesn't count login failures towards account lockout
        // To enable password failures to trigger account lockout, change to shouldLockout: true
        var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
        switch (result)
        {
            case SignInStatus.Success:
                string UserId = User.Identity.GetUserId(); <------ HERE
                HelpRoles hr = new HelpRoles();
                returnUrl = hr.CheckUserRoleAndRedirect(UserId);
                return RedirectToLocal(returnUrl);

2 个答案:

答案 0 :(得分:4)

在对请求进行身份验证后,将根据解密的cookie设置User对象,并且在下一个请求之前不会设置这些cookie,因此在User.Identity不为null之前需要刷新页面。

有关详细信息,请see this post

要解决此问题,在成功案例中,您可以使用电子邮件地址从数据库中获取用户,并使用相应的ID。

答案 1 :(得分:1)

就像约翰·麦克说要解决这个问题一样,你必须在成功案例中获得用户。所以在获得UserId

之前你可能想要这样的东西
var user = userManager.Find(model.UserName, model.Password);

var user = userManager.FindByEmail(model.Email);

var user = userManager.FindByName(model.Username);

修改

在这种情况下,您不必使用如下所示的方法 string UserId = User.Identity.GetUserId();&lt; ------ HERE

因为一旦获得user object,就可以获得user.Id

中的id字段