Asp核心身份,如何在登录后获取userId?

时间:2018-01-16 22:55:41

标签: asp.net asp.net-mvc asp.net-core-mvc asp.net-identity

我有两个名为AdminProfileControllerUserProfileController的控制器。我希望在登录后直接获取userId和用户角色,因为如果用户有AdminProfileController,我希望用户转到Admin Role,如果用户有UserProfileController,则转到User Role

我的代码

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
    {
        ViewData["ReturnUrl"] = returnUrl;
        if (ModelState.IsValid)
        {
            var result = await _signInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, lockoutOnFailure: false);

            if (result.Succeeded)
            {
                return RedirectToLocal(returnUrl);
            }
            else
            {
                ModelState.AddModelError(string.Empty, "Model Erroe");
                return View(model);
            }
        }
        return View(model);
    }


    private IActionResult RedirectToLocal(string returnUrl)
    {
        if (Url.IsLocalUrl(returnUrl))
        {
            return Redirect(returnUrl);
        }
        else
        {
            if (User.IsInRole("Admin"))
            {
                return Redirect("/AdminProfile/Index");
            }
            else
            {
                return Redirect("/UserProfile/Index");
            }
        }
    }

User.IsInRole("Admin")始终为false,我也试图通过此代码获取userId

 string userId = _userManager.GetUserId(HttpContext.User);

但它也返回null。 如何在登录后直接获取userIdrole以导航到指定路径?

2 个答案:

答案 0 :(得分:3)

您没有从User.IsInRole获得价值的原因,因为这会从cookie中读取角色,并且在您使用此方法时尚未设置cookie。

出于同样的原因,你没有从_userManager.GetUserId(HttpContext.User)中得到任何东西。在执行点HttpContext.User尚未设置。

在您进行检查时,要确定用户是否在角色中,最好的办法是使用UserManager.IsInRoleAsync method。此方法检查数据库中的角色。另外,要获取用户对象,您可以使用UserManager.FindByNameAsync method并在那里传递model.UserName值。您将获得ApplicationObject个实例,并将userId用于角色检查。

答案 1 :(得分:2)

我可以解决它。试试吧:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{
    ViewData["ReturnUrl"] = returnUrl;
    if (ModelState.IsValid)
    {
        var result = await _signInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, lockoutOnFailure: false);
        if (result.Succeeded)
        {
            var user = await _userManager.FindByNameAsync(model.UserName);
            string existingRole = _userManager.GetRolesAsync(user).Result.Single();

            //string userid = user.id;
            return RedirectToLocal(returnUrl,existingRole);
        }
        else
        {
            ModelState.AddModelError(string.Empty, "Model Erroe");
            return View(model);
        }
    }
    return View(model);
}





private IActionResult RedirectToLocal(string returnUrl,string roleName)
{
    if (Url.IsLocalUrl(returnUrl))
    {
        return Redirect(returnUrl);
    }
    else
    {
        if (roleName == "Admin")
        {
            return Redirect("/Admin/User");
        }
        else
        {
            return Redirect("/User/UserProfile");
        }

    }
}