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

19

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

[Authorize (Roles = "developer")]

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

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

    
задан Brandon 16.09.2011 в 18:23
источник

3 ответа

45

Пользовательский атрибут авторизации, переопределяющий метод 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()
{
    ...
}
    
ответ дан Darin Dimitrov 16.09.2011 в 18:31
источник
  • Это сработало отлично. –  Brandon 16.09.2011 в 18:50
  • Идеально ... спасибо ... –  Shaz 30.12.2013 в 15:03
  • Где вы помещаете эту пользовательскую реализацию? –  Ricker Silva 15.03.2014 в 19:47
  • @ darin-dimitrov Где мы должны сохранять пользовательские реализации, существует ли соглашение / рекомендация? –  Vijay Chavda 11.10.2016 в 14:57
  • Зверь !!! огромное спасибо –  CyberNinja 02.03.2017 в 21:15
1

Вы можете использовать его как 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",
            };
        }
    }
    
ответ дан codelover 14.01.2018 в 20:07
источник
1

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

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

    
ответ дан TheCodeKing 17.09.2011 в 01:23
источник