2013-04-12 16 views
17

Ich habe Probleme herauszufinden, wie ein Autorisierungsfilter in Web-API mit IAuthorizationFilter von System.Web.Http.Filters zu implementieren.Richtig implementieren IAuthorizationFilter in Web-API

Dies ist ein einfacher Filter I mit 403 verbotenen Reaktion auf alle Nicht-https-Anfragen zu reagieren, schrieb:

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(); 
    } 
} 

Was ich geschrieben habe bisher läuft, aber wenn ich versuche, die api über regelmäßige zugreifen http, es hängt einfach und ich bekomme nie eine Antwort.

+0

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

Antwort

4

Sie müssen entweder die Aufgabe in eine Variable speichern und die Methode task.Start() aufrufen, bevor Sie sie zurückgeben, oder die Methode Task<HttpResponseMessage>.Factory.StartNew(Action action) verwenden, um die Aufgabe zu erstellen.

+12

In diesem (quasi-asynchron) Fall, wie etwa 'Rückkehr Aufgabe .FromResult (Antwort); ' –

7

Für Ihr Szenario könnten Sie einfach von "System.Web.Http.AuthorizeAttribute" ableiten.

Beispiel:

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

Ich tat dies ursprünglich und werde wahrscheinlich damit aufhören (weil es einfacher und leichter zu verstehen ist). Ich habe gerade versucht, die nackte Schnittstelle zu implementieren, um ein Verständnis dafür zu bekommen, was unter der Haube dieser Klasse vorging. –

+2

Kiran hat Recht. Ableiten von AuthorizeAttribute - es gibt mehr, als nur die benutzerdefinierte authZ-Logik (z. B. Unterstützung für AllowAnonymous). Wenn Sie wissen möchten, wie es intern funktioniert, verwenden Sie Reflektor. – leastprivilege

+7

Es gibt Gründe, warum Sie die Schnittstelle anstelle von 'AuthorizeAttribute' verwenden möchten. 'AuthorizeAttribute' ist nett, weil es eine Menge Dinge für Sie erledigt und einige bequeme Methoden zur Verfügung stellt, die den Prozess vereinfachen, aber es verbindet auch Attribut mit Filter. Dies macht es unmöglich, Abhängigkeiten in den Filterkonstruktor einzufügen. Außerdem kann Ihr Filter keine Generika verwenden. All dies wird gelöst, indem die Belange von Filter und Attribut aufgeteilt werden. Natürlich wird davon ausgegangen, dass Ihr Filter sich ergänzen soll oder völlig unabhängig ist, anstatt AuthorizeAttribute zu ergänzen. – crush

Verwandte Themen