我有2个名为AdminProfileController
和UserProfileController
的 Controller 。我想在登录后直接获取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。
登录导航到指定路径后如何直接获取
userId
或role
?
最佳答案
您没有从User.IsInRole
获得期望值的原因是因为它从cookie读取角色,并且在使用此方法时尚未设置cookie。
出于同样的原因,您不会从_userManager.GetUserId(HttpContext.User)
中得到任何东西。在执行时,尚未设置HttpContext.User
。
在进行检查时,确定用户是否在角色中,最好的做法是使用UserManager.IsInRoleAsync
method。此方法检查数据库中的角色。另外,要获取用户对象,您可以使用UserManager.FindByNameAsync
method并在其中传递model.UserName
值。您将获得自己的ApplicationObject
实例,并将获得您的userId
进行角色检查。
关于asp.net - Asp Core身份,登录后如何获取userId?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48291147/