5

У меня есть значение по умолчанию CustomAuthorizeAttribute, определенное в моем проекте Web Api. Переопределить фильтр авторизации с другим

config.Filters.Add(new CustomAuthorizeAttribute()); 

Однако у меня есть специальный контроллер, где я хотел бы использовать SpecialAuthorizeAttribute.

[SpecialAuthorize] 
public class MySpecialController : ApiController 

В Asp.Net vNext у нас есть новый атрибут, чтобы переопределить фильтры по умолчанию, но как я могу заставить его работать в Web Api 2?

Edit 1:

Одним из возможных (но не идеально) решение сделать проверку CustomAuthorizeAttribute, если есть другой AuthorizeAttribute в рамках контроллера или действий. В моем случае у меня есть только SpecialAuthorizeAttribute так:

public class CustomAuthorizeAttribute : AuthorizeAttribute 
{ 
    public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext) 
    { 
     if (actionContext.ControllerContext.ControllerDescriptor.GetCustomAttributes<SpecialAuthorizeAttribute>().Any() || actionContext.ActionDescriptor.GetCustomAttributes<SpecialAuthorizeAttribute>().Any()) 
     { 
      return; 
     } 
     base.OnAuthorization(actionContext); 
    } 

    public override System.Threading.Tasks.Task OnAuthorizationAsync(System.Web.Http.Controllers.HttpActionContext actionContext, System.Threading.CancellationToken cancellationToken) 
    { 
     return base.OnAuthorizationAsync(actionContext, cancellationToken); 
    } 
} 
+1

Вы можете применить свой атрибут CustomAuthorizeAttribute к другим контроллерам, а не делать его глобальным, добавив его в конфигурацию. Это означает, что вам нужно украсить каждый контроллер, но он, вероятно, более четко определяет, что вы на самом деле делаете. –

ответ

0

Вы можете использовать OverrideAuthenticationAttribute. Как вы можете this answer этот атрибут используется для подавления глобальных фильтров проверки подлинности.