Подтвердить что ты не робот

ASP.NET - перенаправление на страницу с ошибкой, если сбой полномочий авторизации

Я использую MVC 3 с проверкой подлинности с помощью форм. На моем контроллере или методах я делаю следующее:

[Authorize (Roles = "developer")]

В этой ситуации я хочу проверить, вошел ли пользователь в систему, а если нет, верните их на страницу входа. Однако, если проверка IsInRole для этого пользователя возвращает false, я хочу, чтобы они переходили на другое представление, которое говорит что-то вроде "Не разрешено".

Каков наилучший способ сделать что-то подобное? Я надеялся избежать создания нового атрибута авторизации, поэтому мне не нужно было реорганизовывать каждый атрибут Authorize во всем моем приложении, но если это то, что требуется, я поеду на этот маршрут.

4b9b3361

Ответ 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",
            };
        }
    }