2009-12-08 43 views
7

我有我已经键入到我的MVC项目帐户控制器中的以下代码,我在管理员和经理角色。当我登录时,我被重定向回我的家庭索引,而不是被重定向到我的AdminApp索引。任何想法,我在我的代码错了?如何根据角色更改ASP.Net MVC登录重定向?

​​

回答

19

您的代码没有按预期工作的原因是因为User在技术上已经而不是已登录并进行身份验证。说什么?但你确实打过SignIn!

FormsAuth.SignIn(userName, rememberMe); - 在这种情况下只是FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);的包装 - 仅在用户浏览器上设置asp.net授权cookie作为响应的一部分。只有在之后请求这一点,用户的浏览器才会有cookie,导致asp.net成员资格正确设置'用户'对象。 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"); 
} 

希望帮助!

+0

像一个魅力工作!我感谢帮助! – Ben 2009-12-19 00:06:12

+0

现在是3年半以后,但是..谢谢! – peter 2013-05-24 00:16:42

+0

哇!它仍然适用于** Asp.Net Core **。 – vivek 2017-10-16 10:23:35

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)))被评估为真,因为RETURNURL参数有你的网页的网址来自默认。

+0

哼。我尝试过,并没有为我工作。我可以在一个aspx页面上成功地使用User.InInRole来显示/隐藏链接,但是当我把它放在一个控制器中时它不起作用。在控制器中是否有另外一种方法来执行此操作? – Ben 2009-12-08 17:54:31

+0

不应该有太大的区别,但是您可以尝试使用Roles.IsUserInRole()。但是,我认为这是最终被User.IsInRole()方法调用的方法。 – 2009-12-08 19:12:58

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