ASP.NET - перенаправление на страницу с ошибкой, если сбой полномочий авторизации
Я использую MVC 3 с проверкой подлинности с помощью форм. На моем контроллере или методах я делаю следующее:
[Authorize (Roles = "developer")]
В этой ситуации я хочу проверить, вошел ли пользователь в систему, а если нет, верните их на страницу входа. Однако, если проверка IsInRole для этого пользователя возвращает false, я хочу, чтобы они переходили на другое представление, которое говорит что-то вроде "Не разрешено".
Каков наилучший способ сделать что-то подобное? Я надеялся избежать создания нового атрибута авторизации, поэтому мне не нужно было реорганизовывать каждый атрибут Authorize во всем моем приложении, но если это то, что требуется, я поеду на этот маршрут.
Ответы
Ответ 1
Пользовательский атрибут authorize, переопределяющий метод HandleUnauthorizedRequest, мог выполнить задание:
public class MyAuthorizeAttribute : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
// The user is not authenticated
base.HandleUnauthorizedRequest(filterContext);
}
else if (!this.Roles.Split(',').Any(filterContext.HttpContext.User.IsInRole))
{
// The user is not in any of the listed roles =>
// show the unauthorized view
filterContext.Result = new ViewResult
{
ViewName = "~/Views/Shared/Unauthorized.cshtml"
};
}
else
{
base.HandleUnauthorizedRequest(filterContext);
}
}
}
а затем:
[MyAuthorize(Roles = "developer")]
public ActionResult Develop()
{
...
}
Ответ 2
Вы также можете сделать это с помощью специальной страницы ошибок для 401 кодов состояния.
Подробнее о деталях реализации см. этот вопрос.
Ответ 3
Вы можете использовать его как this.Because, если у вас нет полномочий он приходит метод.
Контроль авторизации не требуется
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
// The user is not authenticated
base.HandleUnauthorizedRequest(filterContext);
}
else
{
filterContext.Result = new ViewResult
{
ViewName = "~/Views/Shared/Unauthorized.cshtml",
};
}
}