我有 2 个控制器,名为:AdminProfileController
和 UserProfileController
。我想在登录后直接获取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);
但它也返回空。登录后如何直接获得userId
或role
以导航到指定路径?
您没有从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");
}
}
}