Запретить все страницы, кроме определенных страниц с ActionFilter

#c# #asp.net-mvc

#c# #asp.net-mvc

Вопрос:

У меня есть ActionFilter, который применяется к моему базовому контроллеру, который проверяет определенные вещи в запросе и сеансе и проверяет, разрешено ли вам просматривать запрошенный URI.

До сих пор это работало нормально, когда нам нужно запретить все страницы (как это существует сегодня), но разрешить несколько URI здесь и там.

В идеале я бы применил атрибут к тем, которые мы хотим разрешить, а затем проверил наличие этого атрибута в фильтре и разрешил, если он существует, но я не могу понять, как это сделать в фильтре.

Есть идеи или предложения?

Комментарии:

1. вы пытались добавить параметр в свой фильтр и попытаться игнорировать на основе этого параметра? допустим, [CustomAttribute(«IgnoreThis»)]

Ответ №1:

Я потратил больше часа, пытаясь разобраться в этом, а затем разместил здесь, на SO. Минут спустя меня осенило.

Сначала я создал атрибут

 public class AlwaysAllowAnonymousAttribute : Attribute {}
  

Во-вторых, я пометил свое действие или контроллер указанным выше атрибутом

Наконец, в моем ActionFilter я сделал это

 public class VerifyResourceAccess : ActionFilterAttribute, IActionFilter
{
    void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
    {

        var actionAttributes = filterContext.ActionDescriptor.GetCustomAttributes(typeof(AlwaysAllowAnonymousAttribute), false);
        var controllerAttributes = filterContext.ActionDescriptor.ControllerDescriptor.GetCustomAttributes(typeof(AlwaysAllowAnonymousAttribute), false);
        bool alwaysAllow = (actionAttributes.Length > 0) || (controllerAttributes.Length > 0);

        if (!alwaysAllow) {
            /* ... Some logic for checking if this user is allowed to access this resource  ... */
        }

        base.OnActionExecuting(filterContext);
    }
}
  

Любому действию или контроллеру, отмеченному атрибутом, всегда будет разрешен доступ к нему.