我有两个名为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);
但它也返回null。
如何在登录后直接获取userId
或role
以导航到指定路径?
答案 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");
}
}
}