Я пытаюсь перенаправить пользователя на страницу на основе их роли,
Это стандартная реализация функции входа в систему, которая поставляется с 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". Надеюсь, у меня есть смысл.