2013-04-12 18 views
17

Non riesco a capire come implementare un filtro di autorizzazione in API Web utilizzando IAuthorizationFilter da System.Web.Http.Filters.Implementazione corretta di IAuthorizationFilter nell'API Web

Questo è un semplice filtro che ho scritto per rispondere a tutte le richieste non HTTPS con una 403 risposta proibito:

public class HttpsFilter : IAuthorizationFilter { 
    public bool AllowMultiple { 
     get { 
      return false; 
     } 
    } 

    public Task<HttpResponseMessage> ExecuteAuthorizationFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation) { 
     var request = actionContext.Request; 

     if (request.RequestUri.Scheme != Uri.UriSchemeHttps) { 
      HttpResponseMessage response = request.CreateResponse(HttpStatusCode.Forbidden); 
      response.Content = new StringContent("<h1>HTTPS Required</h1>", Encoding.UTF8, "text/html"); 
      actionContext.Response = response; 

      return new Task<HttpResponseMessage>(delegate() { 
       return response; 
      }); 
     } 
     else 
      return continuation(); 
    } 
} 

quello che ho scritto così corre lontano, ma quando provo ad accedere all'API sopra regolare http, si blocca e non ottengo mai una risposta.

+0

http://aspnet.codeplex.com/sourcecontrol/latest#Samples/WebApi/BasicAuthentication/ReadMe.txt – Ali

risposta

4

È necessario salvare l'attività in una variabile e chiamare il metodo task.Start() prima di restituirlo oppure utilizzare il metodo Task<HttpResponseMessage>.Factory.StartNew(Action action) per creare l'attività.

+12

In questo caso (quasi-asincrono), come su 'ritorno Task .FromResult (risposta); ' –

7

Per lo scenario, è possibile derivare semplicemente da "System.Web.Http.AuthorizeAttribute".

Esempio:

public class HttpsFilterAttribute : System.Web.Http.AuthorizeAttribute 
{ 
    public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext) 
    { 
     //do something 
    } 
} 
+1

In realtà l'ho fatto in origine e probabilmente finirò con l'incollarlo (perché è più semplice e facile da capire). Stavo solo cercando di implementare la nuda interfaccia per ottenere una comprensione di quello che stava succedendo sotto il cofano di quella classe. –

+2

Kiran ha ragione. Deriva da AuthorizeAttribute - è in corso più di una semplice logica authZ personalizzata (ad esempio, supporto per AllowAnonymous). Se vuoi sapere come funziona internamente, usa il riflettore. – leastprivilege

+7

Ci sono dei motivi per cui si vorrebbe usare l'interfaccia invece di "AuthorizeAttribute". 'AuthorizeAttribute' è bello perché gestisce un sacco di cose per te ed espone alcuni metodi di convenienza che semplificano il processo, ma accoppia anche l'Attributo con Filtro. Ciò rende impossibile l'inserimento di dipendenze nel costruttore del filtro. Inoltre, il tuo filtro non può utilizzare i generici. Tutto ciò viene risolto dividendo le preoccupazioni del filtro e dell'attributo. Ovviamente, tutto questo presuppone che il tuo filtro è pensato per completare o è completamente indipendente piuttosto che integrare AuthorizeAttribute. – crush

Problemi correlati