我试图根据用户的角色将其重定向到不同的页面。
这是ASP.NET MVC 5自带的登录函数的默认实现:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (ModelState.IsValid)
{
var user = await UserManager.FindAsync(model.UserName, model.Password);
if (user != null)
{
await SignInAsync(user, model.RememberMe);
return RedirectToLocal(returnUrl);
}
else
{
ModelState.AddModelError("", "Invalid username or password.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
private ActionResult RedirectToLocal(string returnUrl)
{
if (Url.IsLocalUrl(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Employer");
}
}
我希望能够根据用户的角色进行重定向,我尝试了以下方式:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (ModelState.IsValid)
{
var user = await UserManager.FindAsync(model.UserName, model.Password);
if (user != null)
{
await SignInAsync(user, model.RememberMe);
//role Employer go to Employer page
if (UserManager.IsInRole(user.Id, "Employer"))
{
return RedirectToAction("Index", "Employer");
}
//role Admin go to Admin page
else if (UserManager.IsInRole(user.Id, "Admin"))
{
return RedirectToAction("Index", "Admin");
}
else
{
//no role
return RedirectToAction("Index", "Home");
}
}
else
{
ModelState.AddModelError("", "Invalid username or password.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
但是有一个问题,虽然该网站将我重定向到了正确的页面,但如果在未使用管理员帐户登录时通过键入URL foo.com/admin进行导航,则该网站会将我带到登录页面,URL为foo.com/Account/Login?ReturnUrl=%2Fadmin,这是预期的行为。如果此时我使用雇主帐户登录,它将重定向我到雇主页面并将我作为雇主登录,这并不是错误的,但不应该发生这种情况,网站应该提醒我应该使用管理员帐户登录,因为返回URL是"admin"。我希望我的意思表达清楚。
return Redirect(returnUrl); }出于安全考虑。
- user10997800