2

Как отключить фильтр авторизации для конкретного обработчика GET в веб-API?ASP.NET Web API Переопределить фильтр авторизации для обработчика

На уровне класса имеется специальный фильтр авторизации, но для одного из методов мне не нужна безопасность. Я попытался применить атрибут [AllowAnonymous], но он все еще проходит через фильтр более высокого уровня и терпит неудачу. Этот настраиваемый фильтр происходит от AuthorizationFilterAttribute. Класс также имеет два других атрибута: OverrideAuthentication и EnableCors.

Я пробовал атрибут AllowAnonymous, но это не так.

Пример кода:

[EnableCors(origins: "*", headers: "*", methods: "*")] 
[OverrideAuthentication] 
[AccountAuthorization] 
public class AccountsController : ApiController 
{ 

    [Route("api/accounts/{accountNumber}/GetX")] 
    [AllowAnonymous] 
    [HttpGet] 
    public HttpResponseMessage GetX(string accountNumber) 
    { 
     HttpResponseMessage response = null; 
     IEnumerable<string> apiKey; 
     if (!Request.Headers.TryGetValues("X-ApiKey", out apiKey) || apiKey.Count() != 1 || apiKey.First() != API_KEY) 
     { 
      throw new HttpResponseException(HttpStatusCode.Forbidden); 
     } 

     // Process 
     // .. 
     // .. 

     return response; 
    } 
} 

EDIT: Связанный ответ не объясняет, что это решение.

+0

Что делать, если вы удалите '[OverrideAuthentication]' и '[AccountAuthorization]' из контроллера? –

+1

Возможный дубликат [AllowAnonymous не работает с Custom AuthorizationAttribute] (http://stackoverflow.com/questions/13595723/allowanonymous-not-working-with-custom-authorizationattribute) –

+0

См. Также, вы можете разрешить анонимность конкретные URL-адреса в веб-интерфейсе http://stackoverflow.com/questions/14588397/disable-windows-authentication-for-webapi –

ответ

3

Наконец-то выдумал.

Поскольку уже существует существующий настраиваемый фильтр авторизации на уровне класса/контроллера, чтобы переопределить определенный обработчик (метод) и заставить его работать без каких-либо фильтров авторизации, нам необходимо переопределить фильтр на контроллере/уровень класса. Поэтому добавление фильтра OverrideAuthorization сделало трюк. Теперь AllowAnonymous будет делать свою магию.

[Route("api/accounts/{accountNumber}/GetX")] 
[AllowAnonymous] 
[OverrideAuthorization] 
[HttpGet] 
public HttpResponseMessage GetX(string accountNumber) 
{ 
    // Process  
    // .. 
    // .. 
}