我正在使用带有.net成员资格的MVC3。 我想根据用户的角色将用户重定向到不同的视图。
我尝试使用AccountControler控制器的LogOn方法来使用User.IsInRole(xxx),但它不起作用。 从我在这里看到的: Forms Authentication User.IsInRole() randomly not working in LogOn
无法在该方法上调用成员资格用户(因为它未登录,用户登录用户的cookie尚未设置)
我不认为它是相关的,但为了以防万一,这是默认情况下在MVC3项目中出现的LogOn方法,以及我试图修改的方法。
[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
if (ModelState.IsValid)
{
if (Membership.ValidateUser(model.UserName, model.Password))
{
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
&& !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
我的问题是: 在登录时根据角色(我只有几个角色)重定向用户的优雅方式是什么? 我看到一些建议说“只是查询会员数据库”,但我不认为这是一种正确的方法。
有什么建议吗?
谢谢!..
即插即用
答案 0 :(得分:0)
由于您链接到我的问题,这是我发现的。 User.IsInRole()
从响应中获取用户名。由于log on
操作中没有用户名(没有使用Model.UserName查找),因此无法在角色中找到该用户。如果重定向它们,则用户信息将添加到重定向,并且可以按角色对用户进行排序。 (至少我认为这就是我发现的。)这就是你想要做的事情:
在您的帐户控制器中替换:
if (Membership.ValidateUser(model.UserName, model.Password))
{
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
&& !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
使用:
if (Membership.ValidateUser(model.UserName, model.Password))
{
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
&& !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Redirect", "Account");
}
}
并添加:
public ActionResult Redirect()
{
if(User.IsInRole("Role1"))
return RedirectToAction("Index", "Home")
else if(User.IsInRole("Role2"))
return RedirectToAction("SomethingElse", "Home")
else
return RedirectToAction("AnotherThing", "Home")
}