#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);
}
}
Любому действию или контроллеру, отмеченному атрибутом, всегда будет разрешен доступ к нему.