Разрешить FilterAttributes на контроллере и действии - PullRequest
3 голосов
/ 08 ноября 2008

Я хотел бы сделать это:

[RequiresAuthentication(CompanyType.Client)]
public class FooController
{    
     public ActionResult OnlyClientUsersCanDoThis()

     public ActionResult OnlyClientUsersCanDoThisToo()

     [RequiresAuthentication]
     public ActionResult AnyTypeOfUserCanDoThis()

Вы можете понять, почему это не сработает. На третьем действии фильтр уровня контроллера будет блокировать не-клиентов. Я бы хотел вместо этого «разрешить» конфликтующие фильтры. Я хотел бы, чтобы более конкретный фильтр (фильтр действий) всегда побеждал. Это кажется естественным и интуитивно понятным.

Давным-давно filterContext предоставил MethodInfo для выполнения действия. Это сделало бы это довольно легко. Я подумал о том, чтобы сделать некоторое отражение самостоятельно, используя информацию о маршруте Это не сработает, потому что действие может быть перегружено, и я не могу сказать, какой из них выполняет текущий.

Альтернативой является использование фильтров на уровне контроллера или на уровне действия, но без микширования, что создаст много дополнительного атрибутного шума.

Ответы [ 3 ]

3 голосов
/ 08 ноября 2008

Мы ищем способ выставить другие фильтры, но без обещаний.

Применение фильтра к контроллеру на самом деле не является «областью действия», это всего лишь сокращение для применения его ко всем фильтрам. К сожалению, это означает, что вы не можете включить все, кроме одного действия. Один из простых способов сделать это - поместить этот метод в другой контроллер. Вы даже можете добавить собственный маршрут только для этого одного случая, чтобы URL-адрес не менялся.

0 голосов
/ 29 октября 2011

Вы можете изменить порядок фильтров с помощью общего фильтра проверки подлинности на контроллере и специальных фильтров проверки подлинности на действиях. Как-то так:

[RequiresAuthentication]
public class FooController
{
  [RequiresAuthentication(CompanyType.Client)]
  public ActionResult OnlyClientUsersCanDoThis()

  [RequiresAuthentication(CompanyType.Client)]
  public ActionResult OnlyClientUsersCanDoThisToo()

  public ActionResult AnyTypeOfUserCanDoThis()
0 голосов
/ 13 января 2010

вы можете поместить логику авторизации в метод OnActionExecuting (..) Контроллера, т.е.

public override void OnActionExecuting(ActionExecutingContext filterContext) {
    base.OnActionExecuting(filterContext);
    new RequiresAuthentication()
    { /* initialization */ }.OnActionExecuting(filterContext);
}

Надеюсь, это поможет,

Thomas

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