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)
希望有所帮助!
| 归档时间: |
|
| 查看次数: |
10604 次 |
| 最近记录: |