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

时间:2009-12-08 09:54:12

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

        }
    } 

3 个答案:

答案 0 :(得分: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.IsUserInRoleRoles.GetRolesForUser有两种方式,例如:

if (Roles.IsUserInRole(userName, "Administrator") || Roles.IsUserInRole(userName, "Administrator"))
{
    return RedirectToAction("Index", "AdminApp");
}

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

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

希望有所帮助!

答案 1 :(得分:2)

我正在使用VS 2013,它是新的身份模型,我最终选择了这个:

foreach (IdentityUserRole identityUserRole in user.Roles)
{
   if (identityUserRole.RoleId == "AdminRoleId")
   {
     return RedirectToAction("Index", "Admin");
   }
   else if (identityUserRole.RoleId == "MemberRoleId")
   {
     return RedirectToAction("Index", "Members");
   }
 }

答案 2 :(得分:0)

您需要取消嵌套if语句。修改如下:

改变这个:

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

到此:

if (User.IsInRole("Administrator") || (User.IsInRole("Manager")))
{               
    return RedirectToAction("Index", "AdminApp");     
} 
else          
{                
return RedirectToAction("Index", "Home"); 
}     

问题是行if(!String.IsNullOrEmpty(returnUrl)))正在评估为True,因为returnUrl参数具有您默认来自的页面的网址。