Sto cercando di reindirizzare utente alla pagina in base al loro ruolo,ASP.NET MVC 5 Identità 2 Login reindirizzamento in base al ruolo dell'utente
Questa è l'implementazione predefinita della funzione di accesso che vengono con 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");
}
}
voglio essere in grado di reindirizzare utenti in base al loro ruolo, ho cercato di fare in questo modo:
[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);
}
Ma c'è un problema, anche se il sito mi reindirizza a th La pagina corretta, Se navigo digitando l'url foo.com/admin quando non sono connesso con un account amministratore, il sito mi porta alla pagina di accesso con url foo.com/Account/Login?ReturnUrl=%2Fadmin , che è il comportamento previsto.
se effettuo il login con un account del datore di lavoro a questo punto, mi reindirizzerà alla pagina del datore di lavoro e mi collegherò come datore di lavoro, il che non è sbagliato, ma non dovrebbe essere il caso, il sito dovrebbe menzionare Dovrei effettuare il login con un account amministratore perché l'URL di ritorno è "admin". Spero di avere un senso.
Ciao, puoi spiegare perché l'istruzione else restituisce RedirectToLocal (returnUrl); è necessario? – Mindless
posso semplicemente eseguire il reindirizzamento (returnUrl) ed eliminare il metodo di azione RedirectToLocal? – Mindless
è necessario causa di controllo se (Url.IsLocalUrl (returnUrl)) – tmg