Asp.net mvc Asp核心,检查用户是否在Identity 1.1中扮演角色?

Asp.net mvc Asp核心,检查用户是否在Identity 1.1中扮演角色?,asp.net-mvc,asp.net-core,asp.net-identity,role-base-authorization,Asp.net Mvc,Asp.net Core,Asp.net Identity,Role Base Authorization,我正在使用asp.net core 1.1和identity 1.1。我的应用程序中有两个角色,分别是“管理员”和“用户”。我希望“管理员”用户在登录后导航到“/AdminProfile/Index”,而“用户”用户在登录后导航到“/UserProfile/Index” 我的登录代码: [HttpGet] public IActionResult Login(string returnUrl = null) { ViewData["ReturnUrl"]

我正在使用asp.net core 1.1和identity 1.1。我的应用程序中有两个角色,分别是“管理员”和“用户”。我希望“管理员”用户在登录后导航到“/AdminProfile/Index”,而“用户”用户在登录后导航到“/UserProfile/Index”

我的登录代码:

    [HttpGet]
    public IActionResult Login(string returnUrl = null)
    {
        ViewData["ReturnUrl"] = returnUrl;
        return View();
    }


    [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, "Error");
                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。如何检查identity 1.1中的用户角色?

经过多次研究,我可以解决这个问题。试试看:

    [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();

                return RedirectToLocal(returnUrl,existingRole);
            }
            else
            {
                ModelState.AddModelError(string.Empty, "Error");
                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");
            }

        }
    }
[HttpPost]
[异名]
[ValidateAntiForgeryToken]
公共异步任务登录(LoginViewModel模型,字符串returnUrl=null)
{
ViewData[“ReturnUrl”]=ReturnUrl;
if(ModelState.IsValid)
{
var result=wait _signInManager.PasswordSignInAsync(model.UserName、model.Password、model.RememberMe、lockoutOnFailure:false);
if(result.successed)
{
var user=await\u userManager.FindByNameAsync(model.UserName);
字符串existingRole=\u userManager.GetRolesAsync(user.Result.Single();
return RedirectToLocal(returnUrl,existingRole);
}
其他的
{
AddModelError(string.Empty,“Error”);
返回视图(模型);
}
}
返回视图(模型);
}
私有IActionResult重定向到本地(字符串返回URL、字符串角色名)
{
if(Url.islocalur(returnUrl))
{
返回重定向(returnUrl);
}
其他的
{
如果(roleName==“管理员”)
{
返回重定向(“/Admin/User”);
}
其他的
{
返回重定向(“/User/UserProfile”);
}
}
}
看一下答案,它应该会帮助您解决问题。