2

Wie kann ich einen Autorisierungsfilter für einen bestimmten GET-Handler in der Web-API deaktivieren?ASP.NET-Web-API Autorisierungsfilter für einen Handler überschreiben

Es gibt einen benutzerdefinierten Autorisierungsfilter auf Klassenebene, aber für eine der Methoden muss ich keine Sicherheit haben. Ich habe versucht, [AllowAnonymous] Attribut anwenden, aber es läuft immer noch durch die höheren Filter und schlägt fehl. Dieser benutzerdefinierte Filter stammt von AuthorizationFilterAttribute. Die Klasse hat auch zwei weitere Attribute: OverrideAuthentication und EnableCors.

Ich versuchte AllowAnonymous Attribut, aber es tut es nicht.

Beispielcode:

[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: Die verknüpfte Antwort nicht erklären, was die Lösung ist.

+0

Was passiert, wenn Sie '[OverrideAuthentication]' und '[AccountAuthorization]' vom Controller entfernen? –

+1

Mögliches Duplikat von [AllowAnonymous funktioniert nicht mit Custom AuthorizationAttribute] (http://StackOverflow.com/questions/13595723/allowanonymous-not-working-with-custom-authorizationAttribute) –

+0

Siehe auch, Sie können möglicherweise anonym an erlauben bestimmte URLs in der Web-API .. http://StackOverflow.com/Questions/14588397/disable-Windows-Authentication-for-Webapi –

Antwort

3

Endlich herausgefunden.

Da bereits ein benutzerdefinierter Autorisierungsfilter auf der Klassen-/Controller-Ebene vorhanden ist, müssen wir einen Filter für den Controller überschreiben, um einen bestimmten Aktionshandler (die Methode) zu überschreiben und ohne Autorisierungsfilter arbeiten zu lassen/Klassenstufe. Das Hinzufügen des Filters OverrideAuthorization hat also den Zweck erfüllt. Jetzt wird AllowAnonymous sein Zauber sein.

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