Asp 核心标识,登录后如何获取用户 ID



我有 2 个控制器,名为: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);

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

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

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

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

我可以解决它。 试试吧:

[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");
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新