2012-06-29 12 views
61

Gibt es eine Möglichkeit SSL für WebAPI zu verlangen? Ein Attribut?Benötigen Sie SSL in WebApi?

Ich sehe kein anwendbares Attribut unter System.Web.Http, etwas wie das RequireHttps Attribut, das wir für MVC haben. Ich versuche nur zu vermeiden, meinen eigenen Attribut-/Nachrichtenhandler zu rollen, wenn es eine eingebaute Lösung gibt.

+0

Dies ist ein Artikel über diese Frage, die lesenswert: https://docs.microsoft.com/en-us/aspnet/web-api/overview/security/Arbeits-mit-ssl-in-web-api – Tohid

Antwort

40

können Sie die RequireHttpsHandler von WebAPIContrib Projekt verwenden. Grundsätzlich sind alle es tut, ist die eingehende Anforderung URI-Schema zu überprüfen:

if (request.RequestUri.Scheme != Uri.UriSchemeHttps) 
{ 
    // Forbidden (or do a redirect)... 
} 

Alternativ Carlos Figueira hat another implementation auf seinem MSDN-Blog.

+1

Dank. Ich dachte mir so viel, wollte das Rad einfach nicht neu erfinden, wenn es eingebaut wurde. – EBarr

47
public class RequireHttpsAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     if (actionContext.Request.RequestUri.Scheme != Uri.UriSchemeHttps) 
     { 
      actionContext.Response = new HttpResponseMessage(HttpStatusCode.Forbidden); 
     } 
    } 
} 
+10

Nur wie ein FYI, die 'ActionFilterAttribute' Klasse, die dieser Code verwendet, ist in' System.Web.Http.Filters'. Es ist ** nicht ** die 'ActionFilterAttribute' Klasse in' System.Web.Mvc' gefunden. –

+4

Für diejenigen, die sich wundern, nachdem Sie diese irgendwo hinzugefügt haben, fügen Sie '[RequireHttps]' oberhalb Ihrer Klasse/Aktionen hinzu. Docs: http://www.asp.net/web-api/overview/security/working-with-ssl-in-web-api – CularBytes

+0

Ich benutze diese Methode auch. Ich habe viele Beispiele mit 'AuthorizationFilterAttribute' gesehen. Irgendein Grund, warum Leute dies über "ActionFilterAttribute" verwenden ??? – Ollie

19

Es ist rätselhaft, dass es keine äquivalent zu dem in ASP.NET Web API Attribute MVC RequireHttps ASP.NET ist. Sie können jedoch leicht ein auf RequireHttps von MVC basierend erstellen.

Alles, was übrig bleibt, ist zu streiten, wie viel redundanter Code da ist.

2

Sie können die folgende Filterklasse verwenden, um Ihre Aktionsmethode zur Verwendung von SSL zu erzwingen. Dies wird Ihre Anfrage mit einer GET-Methode oder einem anderen Verb behandeln. Wenn es eine get-Methode ist, wird der Browser umgeleitet (mithilfe der Standortkopfzeile)) zu der neuen URI. Andernfalls wird eine Nachricht zur Verwendung von https

angezeigt. Im folgenden Code wird angezeigt, dass Sie die OnAuthorization-Methode nach dem Erben von AuthorizationFilterAttribute überschreiben müssen.

 string _HtmlBody = string.Empty; 
     UriBuilder httpsNewUri; 

     var _Request = actionContext.Request; 

     if (_Request.RequestUri.Scheme != Uri.UriSchemeHttps) 
     { 

      _HtmlBody = "<p>Https is required</p>"; 

      if (_Request.Method.Method == "GET"){ 

       actionContext.Response = _Request.CreateResponse(HttpStatusCode.Found); 
       actionContext.Response.Content = new StringContent(_HtmlBody, Encoding.UTF8, "text/html"); 

       httpsNewUri = new UriBuilder(_Request.RequestUri); 
       httpsNewUri.Scheme = Uri.UriSchemeHttps; 
       httpsNewUri.Port = 443; 

       //To ask a web browser to load a different web page with the same URI but different scheme and port 
       actionContext.Response.Headers.Location = httpsNewUri.Uri; 


      }else{ 

       actionContext.Response = _Request.CreateResponse(HttpStatusCode.NotFound); 
       actionContext.Response.Content = new StringContent(_HtmlBody, Encoding.UTF8, "text/html"); 

      } 
} 
1

Sie können den folgenden Code verwenden; (automatisch zu https umleiten) Redirect zu https, wenn eine http-basierte Anfrage gemacht wird.

Um es in Visual Studio zu überprüfen müssen Sie ssl in Visual Studio ermöglichen. Dies kann mit der Eigenschaft enable ssl auf true festgelegt werden.

public class RequireHttpsAttribute: AuthorizationFilterAttribute 
{ 
    public override void OnAuthorization(HttpActionContext actionContext) 
    { 
     if(actionContext.Request.RequestUri.Scheme != Uri.UriSchemeHttps) 
     { 
      // constructing the https url 
      var uriBuilder = new UriBuilder(actionContext.Request.RequestUri) 
      { 
       Scheme = Uri.UriSchemeHttps, 
       Port = 44353 // port used in visual studio for this 
      }; 

      actionContext.Response.Headers.Location = uriBuilder.Uri; 
     } 
    } 
} 

verwendet in Register-Methode wie diese

config.Filters.Add(new RequireHttpsAttribute()); 
0

Nach einigen Recherchen ich dies bestimmt ist wahrscheinlich die am besten geeignete Antwort. Es könnte aktualisiert werden, um JSON, Text oder XML zu liefern, obwohl die Spezifikation angibt, dass HTML empfohlen wird. Hier

public class RequireHttpsAttribute : AuthorizationFilterAttribute 
{ 
    public override void OnAuthorization(HttpActionContext context) 
    { 
     if (context.Request.RequestUri.Scheme != Uri.UriSchemeHttps) 
     { 
      context.Response = new HttpResponseMessage(HttpStatusCode.UpgradeRequired); 
      context.Response.Headers.Add("Upgrade", "TLS/1.1, HTTP/1.1"); 
      context.Response.Headers.Add("Connection", "Upgrade"); 
      context.Response.Headers.Remove("Content-Type"); 
      context.Response.Headers.Add("Content-Type", "text/html"); 
      context.Response.Content = new StringContent("<html><head></head><body><h1>Http protocol is not valid for this service call.</h1><h3>Please use the secure protocol https.</h3></body></html>"); 
     } 
     else base.OnAuthorization(context); 
    } 
} 

ist die Spezifikation: RFC 2817

Verwandte Themen