我有以下代码,我在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");
}
}
}
答案 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.IsUserInRole
或Roles.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参数具有您默认来自的页面的网址。