Если все мои контроллеры .Net / Action нуждаются в Authorize Attr, почему нет атрибута для использования только теми, кто не нужен? - PullRequest
2 голосов
/ 19 сентября 2011

У меня есть приложение, которое требует авторизации для доступа ко всем Контроллерам / Действиям . За исключением входа в систему и ошибок контроллеров / действий .

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

Вы, ребята, сделали что-то подобное?

У меня есть MVC Filter , который выполняется перед всеми действиями, если Зарегистрированный пользователь имеет к ним доступ:

public class ValidatePermissionAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        bool isAuthorized = false;

        //Logic that verify if logged user have permission to access the requested Controller/Action
        ...

        //Redirect to a page Error if Logged User don't have Authorization
        if (!isAuthorized)
        {
            RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary();
            redirectTargetDictionary.Add("action", "Erro");
            redirectTargetDictionary.Add("controller", "Index");

            context.Result = new RedirectToRouteResult(redirectTargetDictionary);
        }
    }
}

Я думаю, что лучший способ сделать это. Я могу создать Blank Custom Attribute и поместить в контроллеры, не нуждающиеся в авторизации, и проверить это в моем Filter :

public class ValidatePermissionAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        bool isAuthorized = false;

        var DoNotRequiresAuthorizationAttributes = context.ActionDescriptor.GetCustomAttributes(typeof(DoNotRequiresAuthorizationAttribute), false);

        if (DoNotRequiresAuthorizationAttributes.Length > 0)
            isAuthorized = true;

        ...

        //Redirect to a page Error if Logged User don't have Authorization
        if (!isAuthorized)
        {
            RouteValueDictionary redirectTargetDictionary = new RouteValueDictionary();
            redirectTargetDictionary.Add("action", "Erro");
            redirectTargetDictionary.Add("controller", "Index");

            context.Result = new RedirectToRouteResult(redirectTargetDictionary);
        }
    }
}

Что вы, эксперты, ребята думаете?

Обновление:

Думая лучше, я могу заменить мой Фильтр на Настраиваемый атрибут авторизации и зарегистрировать его, чтобы он действовал во всех Контроллерах / Действиях в Global. asax

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new MyCustomAuthorizeAttribute());
}

Обновление 2:

Вместо этого создайте Blank Custom Attribute и вставьте в контроллеры, не требуется авторизация. Я передаю параметры моей пользовательской авторизации. Контроллеры не нуждаются в авторизации (в Global.asax):

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new ValidatePermissionAttribute("Login", "Erro"));
}

Мой атрибут авторизации:

public class ValidatePermissionAttribute : AuthorizeAttribute
{
    ...

    public ValidatePermissionAttribute(params string[] optionalControllers)
    {
        _optionalControllers = optionalControllers;
    }

    ...
}

Обновление 3:

Условные фильтры - путь.

Ответы [ 3 ]

6 голосов
/ 19 сентября 2011

Несколько способов обработки массовых реализаций атрибутов:

Мне уже говорили, что проблема с использованием атрибута фильтра заключается в том, что результат может быть кэширован с помощью кэширования выходных данных, а затем он не запустится. Лучше реализовать интерфейс IAuthorizationFilter (или класс AuthorizeAttribute) и создать вместо него фильтр авторизации.

6 голосов
/ 19 сентября 2011

Рассматривали ли вы использование условных фильтров в ASP.NET MVC 3 ?

2 голосов
/ 19 сентября 2011

Если цель состоит просто в том, чтобы уменьшить необходимость повторного объявления атрибута во многих местах, то, кажется, можно добиться того же самого, создав один абстрактный AuthorizeController с атрибутом, и любой контроллер, все действия которого требуют авторизации, может наследовать что.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...