Asp.net mvc 基于角色的ASP.NET MVC登录和重定向

Asp.net mvc 基于角色的ASP.NET MVC登录和重定向,asp.net-mvc,authentication,Asp.net Mvc,Authentication,我正在使用ASP.NET MVC生成的默认登录方法,并希望对其进行更改,以便根据用户的角色将其重定向到指定的视图。我已检查用户是否处于该角色。我在SignInStatus成功块中进行了重定向,但没有成功 我在其他代码块中使用User.IsInRole(),效果很好。我认为用户在执行if语句时没有完全登录。我认为情况就是这样,但我不确定我能实施什么工作 下面是我的代码 // POST: /Account/Login [HttpPost] [AllowAnonymous] [ValidateCust

我正在使用ASP.NET MVC生成的默认登录方法,并希望对其进行更改,以便根据用户的角色将其重定向到指定的视图。我已检查用户是否处于该角色。我在SignInStatus成功块中进行了重定向,但没有成功

我在其他代码块中使用
User.IsInRole()
,效果很好。我认为用户在执行if语句时没有完全登录。我认为情况就是这样,但我不确定我能实施什么工作

下面是我的代码

// POST: /Account/Login
[HttpPost]
[AllowAnonymous]
[ValidateCustomAntiForgeryTokenAttribute]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
    if (!ModelState.IsValid)
    {
        return View(model);
    }

    // This doesn't count login failures towards account lockout
    // To enable password failures to trigger account lockout, change to shouldLockout: true
    var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
    switch (result)
    {
        case SignInStatus.Success:
            if (User.IsInRole("Customer"))
            {
                return RedirectToAction("Customer", "Home");
            }
            else if (User.IsInRole("Requestor"))
            {
                return RedirectToAction("Caterer", "Home");
            }
            else if (User.IsInRole("Admin"))
            {
                return RedirectToAction("Admin", "Home");
            }
            else
            {
                return RedirectToLocal(returnUrl);
            }
        case SignInStatus.LockedOut:
            return View("Lockout");
        case SignInStatus.RequiresVerification:
            return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
        case SignInStatus.Failure:
        default:
            ModelState.AddModelError("", "Invalid login attempt.");
            return View(model);
    }
}
//POST:/Account/Login
[HttpPost]
[异名]
[ValidateCustomAntiForgeryTokenAttribute]
公共异步任务登录(LoginView模型,字符串返回URL)
{
如果(!ModelState.IsValid)
{
返回视图(模型);
}
//这不会将登录失败计入帐户锁定
//要使密码失败触发帐户锁定,请更改为shouldLockout:true
var result=wait SignInManager.PasswordSignInAsync(model.Email、model.Password、model.RememberMe、shouldllockout:false);
开关(结果)
{
案例标志状态成功:
if(User.IsInRole(“客户”))
{
返回重定向到操作(“客户”、“主页”);
}
else if(User.IsInRole(“请求者”))
{
返回活动(“餐饮服务商”、“家”);
}
else if(User.IsInRole(“Admin”))
{
返回重定向到操作(“管理”、“主页”);
}
其他的
{
返回重定向到本地(returnUrl);
}
案例标志状态锁定输出:
返回视图(“锁定”);
案例标志状态。要求验证:
return RedirectToAction(“SendCode”,new{ReturnUrl=ReturnUrl,RememberMe=model.RememberMe});
案例信号状态故障:
违约:
AddModelError(“,”登录尝试无效“);
返回视图(模型);
}
}

你是对的。此处引用的用户对象由ASP.NET管道中的“身份验证”步骤设置。有关这方面的更多信息,请查看

PasswordSignInAsync
仅验证您的用户并为将来的请求设置身份验证cookie。它不影响用户对象,用户对象仍然表示通过管道输入的未经验证的状态

实现所需功能的一个简单方法是将登录方法重定向到另一个操作(类似于RedirectUser),该操作随后执行基于角色的路由。此方法将具有对经过身份验证的用户对象和
IsInRole
方法的完全访问权限


或者,您可以实现自己的
User.IsInRole
方法,直接查询数据库

多亏了@stephen.vakil的链接,我通过更改SignInStatus.Success案例中的代码块成功地使它工作起来

            case SignInStatus.Success:
                var user = await UserManager.FindAsync(model.Email, model.Password);
                var roles = await UserManager.GetRolesAsync(user.Id);

                if (roles.Contains("Customer"))
                {
                    return RedirectToAction("Customer", "Home");
                }
                else if (roles.Contains("Requestor"))
                {
                    return RedirectToAction("Caterer", "Home");
                }
                else if (roles.Contains("Admin"))
                {
                    return RedirectToAction("Admin", "Home");
                }
                else
                {
                    return RedirectToLocal(returnUrl);
                }
                ......

如果您想使用asp.net身份的默认登录名,那么在成功获得结果后,您应该获得这样的角色,然后重定向将解决此问题

       var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
        switch (result)
        {
            case SignInStatus.Success:

                var userId = SignInManager.AuthenticationManager.AuthenticationResponseGrant.Identity.GetUserId();
                if (UserManager.IsInRole(userId, "Super Admin"))
                {
                    return RedirectToAction("Index", "DashBoard");
                }}
[HttpPost]
公共异步任务登录([FromForm]LoginDto userDto,字符串returnUrl)
{
if(ModelState.IsValid)
{
//var googlerepactcha=\u googlerepactchasservice.ResponceVerify(userDto.repactchatoken);
//如果(!googlerepactcha.Result.success&&googlerepactcha.Result.score视图(“登录”);
//}
var signedUser=await userManager.findbyemailsync(userDto.Email);
var result=wait signInManager.PasswordSignInAsync(signedUser.Email、userDto.Password、userDto.RememberMe、lockoutOnFailure:false);
if(result.successed)
{
如果(!string.IsNullOrEmpty(returnUrl)和&Url.islocalur(returnUrl))
{
返回LocalRedirect(returnUrl);
}
其他的
{
var roles=await userManager.GetRolesAsync(signedUser);
if(roles.Contains(“超级管理员”))
返回重定向操作(“仪表板”、“用户”);
if(roles.Contains(“数据输入操作员”))
返回重定向到操作(“业务列表”、“业务”);
if(roles.Contains(“业务管理员”))
返回重定向到操作(“我的业务”、“业务”);
}
}
AddModelError(string.Empty,“无效登录尝试”);
}
返回等待任务。运行(()=>View(userDto));
}
可能相关:
[HttpPost]
public async Task<IActionResult> SignIn([FromForm]LoginDto userDto, string returnUrl)
{
    if (ModelState.IsValid)
    {
        //var googlereCaptcha = _googlereCaptchaService.ResponceVerify(userDto.ReCaptchaToken);
        //if (!googlereCaptcha.Result.success && googlereCaptcha.Result.score <= 0.5)
        //{
        //    TempData["LoginSuccessMsg"] = "You are not Human.";
        //    return await Task.Run(() => View("SignIn"));
        //}

        var signedUser = await userManager.FindByEmailAsync(userDto.Email);
        var result = await signInManager.PasswordSignInAsync(signedUser.Email, userDto.Password, userDto.RememberMe, lockoutOnFailure: false);

        if (result.Succeeded)
        {
            if (!string.IsNullOrEmpty(returnUrl) && Url.IsLocalUrl(returnUrl))
            {
                return LocalRedirect(returnUrl);
            }
            else
            {
                var roles = await userManager.GetRolesAsync(signedUser);
                if (roles.Contains("Super Admin"))
                    return RedirectToAction("Dashboard", "User");
                if (roles.Contains("Data Entry Operator"))
                    return RedirectToAction("BusinessList", "Business");
                if (roles.Contains("Business Admin"))
                    return RedirectToAction("MyBusiness", "Business");
            }
        }

        ModelState.AddModelError(string.Empty, "Invalid Login Attempt");
    }

    return await Task.Run(() => View(userDto));
}