如何根据角色更改ASP.Net MVC登录重定向?

Ben*_*Ben 7 asp.net-mvc redirect asp.net-membership roles

我在我的MVC项目中输入了以下代码,我输入了管理员和管理员角色.当我登录时,我被重定向回我的主索引,而不是被重定向到我的AdminApp索引.我的代码中出错的任何想法?

[AcceptVerbs(HttpVerbs.Post)]
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings",
        Justification = "Needs to take same parameter type as Controller.Redirect()")]
    public ActionResult LogOn(string userName, string password, bool rememberMe, string returnUrl)
    {

        if (!ValidateLogOn(userName, password))
        {
                return View();
        }

        FormsAuth.SignIn(userName, rememberMe);
        if (!String.IsNullOrEmpty(returnUrl))
        {
            return Redirect(returnUrl);
        }
        else
        {
            if (User.IsInRole("Administrator") || (User.IsInRole("Manager")))
            {
                return RedirectToAction("Index", "AdminApp");
            }
            else
            {
                return RedirectToAction("Index", "Home");
            }

        }
    } 
Run Code Online (Sandbox Code Playgroud)

Kur*_*ler 20

如预期你的代码是不工作的原因是因为User已经在技术上没有被登录和认证呢.说什么?但你确实打电话给SignIn!

FormsAuth.SignIn(userName, rememberMe);- 在这种情况下只是一个包装器FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);- 仅在用户浏览器上设置asp.net授权cookie作为响应的一部分.只有之后请求用户的浏览器才会拥有cookie,导致asp.net成员资格正确设置'User'对象.LogOn方法中的所有代码仍假定为匿名用户,因此您的IsInRole检查失败并且您被重定向到主页.将您的if语句放在另一个页面上,在您登录后,您将看到现在User.IsInRole按预期工作.(事实上​​,这就是你使用User.IsInRole,而不是在登录过程中)

那么如何在实际登录过程中进行检查?Roles.IsUserInRole或者Roles.GetRolesForUser有两种方式,例如:

if (Roles.IsUserInRole(userName, "Administrator") || Roles.IsUserInRole(userName, "Administrator"))
{
    return RedirectToAction("Index", "AdminApp");
}
Run Code Online (Sandbox Code Playgroud)

您必须明确指定登录用户的用户名,该用户名将实际执行针对成员资格数据存储的查询.在这方面,我相信上面的代码会导致执行两个查询,您可能会发现这些查询不太理想.这是Roles.GetRolesForUser可能是更好的选择:

string[] roles = Roles.GetRolesForUser(userName);
if (roles.Contains("Administrator") || roles.Contains("Manager"))
{
    return RedirectToAction("Index", "AdminApp");
}
Run Code Online (Sandbox Code Playgroud)

希望有所帮助!