Вы можете написать собственный атрибут авторизации, который будет перенаправлять на правильное logon
действие:
public class MyAuthorizeAttribute : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
var roles = Roles.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
if (roles.Contains("admin", StringComparer.OrdinalIgnoreCase))
{
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new
{
controller = "account",
action = "adminlogon",
returnUrl = filterContext.HttpContext.Request.RawUrl
}));
}
else
{
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new
{
controller = "account",
action = "logon",
returnUrl = filterContext.HttpContext.Request.RawUrl
}));
}
}
}
, а затем украсьте ваши контроллеры / действия с ним:
[MyAuthorize(Roles = "admin")]
public ActionResult Foo()
{
return View();
}
[MyAuthorize(Roles = "normaluser")]
public ActionResult Bar()
{
return View();
}
Теперь, если пользователь, не прошедший проверку подлинности, пытается выполнить действие Foo, он будет перенаправлен на действие /account/adminlogon
, а если он попытается выполнить действие Bar, он будет перенаправлен на действие /account/logon
. В обоих случаях текущий URL будет передан в качестве параметра returnUrl, чтобы при успешном входе в систему пользователь мог быть перенесен на страницу, которую он первоначально пытался просмотреть.