2014-12-09 10 views
5

Ich habe diese App, wo ich meine benutzerdefinierten Header in der Web.Config festlegen möchten, leider ist dies nicht immer narrensicher.Probleme mit CORS in ASP.NET

<customHeaders> 
    <add name="Access-Control-Allow-Origin" value="*" /> 
    <add name="Access-Control-Allow-Methods" value="*" /> 
    <add name="Access-Control-Allow-Headers" value="*" /> 
    </customHeaders> 

Der obige Satz und Wiederholungen davon wie

<customHeaders> 
    <add name="Access-Control-Allow-Origin" value="*" /> 
    <add name="Access-Control-Allow-Methods" value="OPTIONS,GET,PUT,DELETE,POST" /> 
    <add name="Access-Control-Allow-Headers" value="Authorization,Content-Type" /> 
    </customHeaders> 

hat sich für mich nicht funktioniert in allen Szenarien gearbeitet. Ab sofort funktioniert diese Einstellung in etwa 50% der Testmaschinen und gibt in anderen 405 Method Not Allowed.

Die Alternative wird in WebApiConfig.cs festgelegt und die benutzerdefinierten Header in Web.config auskommentieren.

//Web API Cross origin requests - Enable 
    var cors = new EnableCorsAttribute("*", "*", "*"); 
    config.EnableCors(cors); 

Warum gibt es in dieser so viel Unklarheit und wie weiß ich sicher, wo CORS die ganze Zeit funktioniert? Ich bin wirklich daran interessiert, CORS nur auf Web.config zu setzen, da ich die Flexibilität haben möchte, es in der bereitgestellten Version zu modifizieren.

Antwort

13

Ich glaube, dass Ihr ‚zufällig‘ Problem tritt auf, weil Sie die Preflight OptionsAnfragen für PUT und DeleteVerben Handhabung sind.

Für die beiden Verben über eine zusätzliche Anfrage erwähnt erzeugt wird, Options, auf die Web API Bedürfnisse zu reagieren, um zu bestätigen, dass es in der Tat CORS zu unterstützen konfiguriert ist.

Um dies zu behandeln, alles, was Sie tun müssen, ist eine leere Antwort zurück zu senden. Sie können in Ihrer Aktion tun dies, oder Sie können es so global tun:

protected void Application_BeginRequest() 
{ 
    if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS") 
    { 
     Response.Flush(); 
    } 
} 

Diese zusätzliche Kontrolle wurde hinzugefügt, dass alten APIs, um sicherzustellen, dass nur GET und POST Anforderungen zu akzeptieren entworfen wurden, wird nicht ausgenutzt werden. Stellen Sie sich vor, Sie senden eine DELETE Anfrage an eine API entworfen, wenn dieses Verb nicht existiert. Das Ergebnis ist unvorhersehbar und die Ergebnisse könnten gefährlich sein.

Auch in web.config, sollten Sie die Methoden angeben anstelle von *

<httpProtocol> 
    <customHeaders> 
    <add name="Access-Control-Allow-Origin" value="*" /> 
    <add name="Access-Control-Allow-Headers" value="Content-Type" /> 
    <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" /> 
    </customHeaders> 
</httpProtocol> 
+0

Ja, das scheint, wie das Problem. Das Problem scheint zufällig zu sein, aber nach dem, was ich von deinem Beitrag gelesen habe, scheint es, als ob es nicht wirklich sein könnte. Kannst du bitte den Grund oder das erklären? – Shouvik

+0

Diese zusätzliche Überprüfung wurde hinzugefügt, um sicherzustellen, dass alte APIs, die nur für GET- und POST-Anforderungen konfiguriert wurden, nicht ausgenutzt werden. Stellen Sie sich vor, Sie senden ein DELETE-Verb an eine API, die entworfen wurde, als dieses Verb nicht existierte. Das Ergebnis ist unsicher und könnte zu schwerwiegenden Problemen bei den Daten hinter dieser API führen. –

+0

Arbeitete perfekt. – shammelburg

0

Es gibt keine Zweideutigkeit mit CORS, Ihnen ein paar Fälle, die Sie über

1- denken müssen, wenn Sie möchten, dass CORS für Ihre Web-APIs nur die Bibliothek "Microsoft.AspNet.WebApi.Cors" verwendet.

2- Wenn Sie CORS für die gesamte Website (einschließlich der Web-APIs, SignalR, ..etc) aktivieren möchten, verwenden Sie die Bibliothek "Microsoft.Owin.Cors".

mit einer beliebigen Bibliothek aus den oben genannten 2 wird definitiv funktionieren und cors wird aktiviert, jetzt, wenn Sie die URLs konfigurieren möchten, können Sie dies aus Ihrer Datenbank/Config-Datei, wenn Ihre Anwendung die URL, die Sie übergeben zu EnableCors kann zum Beispiel aus der Datenbank/Config-Datei kommen, aber die untere Zeile ist zu vermeiden, Hinzufügen von Corse-Header zu der web.config.

Um zu wissen, um CORS für Ihre Web-API zu aktivieren, können Sie meinen Artikel here, die CORS für die Web-APIs aktiviert und verwenden Sie von AngularJS-Client.

Hoffe, dass hilft.

0

Für jeden, der dies liest, kann dies helfen.

Auch mit dem folgenden Startcode

var cors = new EnableCorsAttribute("*", "*", "GET, POST, PUT, DELETE, OPTIONS"); 
config.EnableCors(cors); 

Ich musste explcitly die Verben der Methode Web Api Aktion hinzufügen:

[Route("sanity")] 
[HttpOptions] 
[HttpPost] 
public List<PostImportView> Sanity(SanityFilter filter) 
{ 
    .... 

ziemlich sinnlos und ärgerlich

Verwandte Themen