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

时间:2015-08-27 22:58:14

标签: asp.net-mvc authentication

我正在使用ASP.NET MVC生成的默认Login方法,并希望对其进行更改,以便根据用户的角色重定向到指定的View。我检查过用户是否担任该角色。我在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);
            }
        }

4 个答案:

答案 0 :(得分:3)

感谢@ 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);
                }
                ......

答案 1 :(得分:2)

你是对的。您在此处引用的用户对象由&#34;身份验证&#34;设置。步骤在ASP.NET管道中。有关此问题的更多信息,请查看Lifecycle of an ASP.NET 5 Application

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

实现所需内容的一种简单方法是将Login方法重定向到另一个操作(类似RedirectUser),然后执行基于角色的路由。此方法将具有对经过身份验证的User对象和IsInRole方法的完全访问权限。

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

答案 2 :(得分:0)

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

       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");
                }}

答案 3 :(得分:0)

[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));
}
相关问题