Я пытаюсь перенаправить пользователя на страницу в зависимости от их роли,ASP.NET MVC 5 Идентичность 2 Войти редирект на основе роли пользователя
Это реализацию по умолчанию функции входа, которые приходят с 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);
}
но есть проблема, хотя сайт перенаправляет меня к й e correct page, Если я нахожусь, набрав url foo.com/admin, когда я не вошел в систему с учетной записью администратора, сайт приводит меня на страницу входа с URL-адресом foo.com/Account/Login?ReturnUrl=%2Fadmin , что является ожидаемым поведением.
Если я вхожу в систему с учетной записью работодателя на этом этапе, он перенаправит меня на страницу работодателя и зарегистрирует меня как работодателя, что не так, но это не должно быть так, сайт должен упоминать Я должен войти в систему с учетной записью администратора, потому что возвращаемый URL-адрес - «admin». Надеюсь, у меня есть смысл.
Привет, Не могли бы вы объяснить, почему инструкция else возвращает RedirectToLocal (returnUrl); необходим? – Mindless
Могу ли я просто перенаправить (returnUrl) и удалить метод действия RedirectToLocal? – Mindless
вам нужна причина проверки (Url.IsLocalUrl (returnUrl)) – tmg