ASP.NET - перенаправить на страницу ошибки, если авторизация ролей не удалась - PullRequest
20 голосов
/ 16 сентября 2011

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

[Authorize (Roles = "developer")]

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

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

Ответы [ 3 ]

47 голосов
/ 16 сентября 2011

Пользовательский атрибут авторизации, переопределяющий метод 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()
{
    ...
}
1 голос
/ 14 января 2018

Вы можете использовать его следующим образом. Потому что, если у вас нет полномочий, это приходит метод.Контроль авторизации не требуется

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",
            };
        }
    }
1 голос
/ 17 сентября 2011

Вы также можете сделать это с помощью пользовательской страницы ошибок для 401 кодов состояния.

См. этот вопрос для деталей реализации.

...