2014-03-12 8 views
70

Ich verwende AngularJS $ http auf der Client-Seite, um auf einen Endpunkt einer ASP.NET-Web-API-Anwendung auf der Serverseite zuzugreifen. Da der Client in einer anderen Domäne als Server gehostet wird, brauche ich CORS. Es funktioniert für $ http.post (URL, Daten). Aber sobald ich den Benutzer authentifizieren und eine Anfrage über $ http.get (url) machen, bekomme ich die MeldungDer 'Access-Control-Allow-Origin'-Header enthält mehrere Werte

 
The 'Access-Control-Allow-Origin' header contains multiple values 'http://127.0.0.1:9000, http://127.0.0.1:9000', but only one is allowed. Origin 'http://127.0.0.1:9000' is therefore not allowed access. 

Fiddler mir zeigt, dass es in der Tat zwei Header-Einträge in der Erhaltungs-Anforderung nach einer erfolgreichen Optionen anfordern. Was und wo mache ich etwas falsch?

aktualisieren

Wenn ich jQuery $ statt $ verwenden .get http.get, die gleiche Fehlermeldung angezeigt. Das scheint bei AngularJS kein Problem zu sein. Aber wo ist es falsch?

Antwort

41

Ich habe

config.EnableCors(new EnableCorsAttribute(Properties.Settings.Default.Cors, "", ""))

sowie

app.UseCors(CorsOptions.AllowAll);

auf dem Server. Dies führt zu zwei Header-Einträgen. Benutze einfach den Letzten und es funktioniert.

+2

Es scheint, als ob Sie Properties.Settings.Default.Cors aus einer Einstellungsdatei lesen. Können Sie ein Beispiel veröffentlichen? Und in welcher Klasse ist UseCors? – Hoppe

+0

"Uncaught ReferenceError: EnableCorsAttribute ist nicht definiert"? – circuitry

+0

@Hoppe, bitte schauen Sie sich http://msdn.microsoft.com/en-us/library/dn314597(v=vs.118).aspx an. Es wird erläutert, dass der erste Parameter des EnableCorsAttribute die zulässigen Ursprünge sind. Zum Beispiel "*" um alle zuzulassen. –

4

Apache Server:

Ich gebe die gleichen, aber es war, weil ich den Stern in meiner Datei, den Zugriff auf den Server zur Verfügung gestellt, zB keine Anführungszeichen (") hatte‚.htaccess.‘:

Header add Access-Control-Allow-Origin: * 
Header add Access-Control-Allow-Origin "*" 

Sie auch eine Datei ‚.htaccess' in einem Ordner mit einem anderen‘ .htaccess' kann aus zB

/ 
- .htaccess 
- public_html/.htaccess (problem here) 

in Ihrem Fall statt ‚*‘ ein sterisk wäre der ip (http://127.0.0.1:9000) Server, dem Sie die Erlaubnis erteilen, Daten zu liefern.

ASP.NET:

überprüfen, dass es keine 'Access-Control-Allow-Origin' duplicate in Ihrem Code.

Developer Tools:

Mit Chrome Sie Ihre Anfrage-Header überprüfen können. Drücken Sie die Taste F12 und gehen Sie zur Registerkarte "Netzwerk", führen Sie jetzt die AJAX-Anfrage und erscheint in der Liste, klicken Sie und geben Sie alle Informationen dort ist.

Access-Control-Allow-Origin: *

+0

Manchmal ist es so einfach ... Während ich versuchte, den verwirrten Web-Service auf IIS/Chrome laufen zu lassen, spielte ich mit der Application_BeginRequest-Methode herum und vergaß es ... Duplizierung in meinem eigenen Code ! Danke, dass Sie mich auf das Offensichtliche hingewiesen haben! :) –

+1

Um die CORS-Antwortheader zu erhalten, müssen Sie auch eine tatsächliche stammverwandte Anfrage simulieren, so dass sie möglicherweise nicht angezeigt wird, wenn Sie nur auf der Netzwerkseite der laufenden Site nachsehen. Wenn Sie jedoch etwas wie DHC (https://chrome.google.com/webstore/detail/dhc-resthttp-api-client/aejoelaoggembcahagimdiliamlcdmfm?hl=de) verwenden, um Ihre AJAX-Anfrage auszuführen, werden Sie technisch von einer anderen Domain aus angerufen. Dadurch wird CORS ausgelöst und Sie können die Access Control-Header sehen. –

29

Ich verwende Cors 5.1.0.0, nach vielen Kopfschmerzen, entdecken ich das Problem Access-Control-Allow-Origin & Access-Control-Allow-Header-Header vom Server

dupliziert wird

Entfernt config.EnableCors() von der WebApiConfig.CS-Datei und setzen Sie einfach das [EnableCors("*","*","*")] Attribut auf der Controller-Klasse

Check this article für weitere Details.

4

Eigentlich können Sie nicht mehrere Header Access-Control-Allow-Origin setzen (oder zumindest wird es nicht in allen Browsern funktionieren). Stattdessen können Sie bedingt eine Umgebungsvariable gesetzt und dann in Header Direktive verwenden:

SetEnvIf Origin "^(https?://localhost|https://[a-z]+\.my\.base\.domain)$" ORIGIN_SUB_DOMAIN=$1 
Header set Access-Control-Allow-Origin: "%{ORIGIN_SUB_DOMAIN}e" env=ORIGIN_SUB_DOMAIN 

So in diesem Beispiel der Antwort-Header hinzugefügt werden, nur dann, wenn ein Request-Header Origin Spiele RegExp: ^(https?://localhost|https://[a-z]+\.my\.base\.domain)$ (es bedeutet im Grunde localhost über HTTP oder HTTPS und * .my.base.domain über HTTPS).

Vergessen Sie nicht, das Modul setenvif zu aktivieren.

Docs:

BTW. Die }e in %{ORIGIN_SUB_DOMAIN}e ist kein Tippfehler. So verwenden Sie die Umgebungsvariable in Header Direktive.

+1

Haben Sie eine Quelle, um mehrere Zugriffskontrollheader nicht zu setzen? Ich kann nichts finden, was dies bestätigt. – Spencer

+0

Sehr intelligente und saubere Lösung. Arbeitete für mich. –

+0

@Spencer "In der Praxis ist die Erstellung von Ursprungslisten oder -nullen eingeschränkter. Anstatt eine durch Leerzeichen getrennte Liste von Ursprüngen zuzulassen, ist * entweder ein einzelner Ursprung oder die Zeichenfolge" null "*." http://www.w3.org/TR/cors/#access-control-allow-origin-response-header – Nux

1

hatte gerade dieses Problem mit einem Nodejs-Server.

hier ist, wie ich es behoben habe.
Ich führe meinen Node-Server durch eine nginx proxy und ich setze Nginx und node zu beiden allow cross domain requests und es nicht so, also habe ich es aus Nginx entfernt und ließ es in Knoten und alles war gut.

+0

Vielen Dank für diese Antwort! Es löste ein Problem, das ich lange mit einem nginx + Rack (Ruby) Setup nicht lösen konnte. Gleiches Problem, gleiche Lösung: Schalte die Header-Zusätze in nginx ab und lass das 'rack-cors'-Juwel die CORS-Sachen behandeln. Bam, repariert. – Pistos

31

Wir stießen auf dieses Problem, weil wir CORS nach Best Practice eingerichtet hatten (z. B. http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api) und auch einen benutzerdefinierten Header <add name="Access-Control-Allow-Origin" value="*"/> in web.config hatten.

Entfernen Sie den Eintrag web.config, und alles ist gut.

Im Gegensatz zu @ mww's Antwort, haben wir immer noch EnableCors() in der WebApiConfig.cs UND eine EnableCorsAttribute auf dem Controller. Als wir das eine oder andere herausholten, stießen wir auf andere Probleme.

+7

Ich habe diese Zeile entfernt und ich hatte die folgenden zwei anderen Einträge in der Datei web.config, die ich nicht entfernt habe:

+0

das war meine Problem .. danke – lawphotog

+1

Das ist der Schlüssel, Sie müssen nur einmal CORS aktivieren, mein Problem war, dass ich es auch in meiner web.config sowie app.UseCors() aktiviert hatte ... Ich entfernte den web.config Eintrag und nur verwendet die app.UseCors (Microsoft.Owin.Cors.CorsOptions.AllowAll); Methode stattdessen. –

6

Ich hatte auch sowohl OWIN als auch meine WebAPI, die anscheinend beide CORS separat aktiviert haben, was wiederum den 'Access-Control-Allow-Origin' header contains multiple values Fehler verursachte.

landete ich den gesamten Code zu entfernen, die CORS aktiviert und fügte dann die folgenden auf den system.webServer Knoten meiner Web.Config:

<httpProtocol> 
    <customHeaders> 
    <add name="Access-Control-Allow-Origin" value="https://stethio.azurewebsites.net" /> 
    <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE" /> 
    <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept, Authorization" /> 
    </customHeaders> 
</httpProtocol> 

Dadurch erfüllt CORS Anforderungen für OWIN (unter Berücksichtigung Login) und für WebAPI (Erlaube API-Aufrufe), aber es hat ein neues Problem verursacht: eine OPTIONS Methode konnte nicht während Preflight für meine API-Aufrufe gefunden werden. Das Update für das war einfach - ich brauchte nur die folgenden von der handlers Knoten meine Web.Config zu entfernen:

<remove name="OPTIONSVerbHandler" /> 

hoffe, das hilft jemand.

4

Dies passiert, wenn Sie die Cors-Option an mehreren Standorten konfiguriert haben.In meinem Fall hatte ich es auf der Controller-Ebene sowie in der Startup.Auth.cs/ConfigureAuth.

Mein Verständnis ist, wenn Sie es breite Anwendung wollen dann einfach konfigurieren unter Startup.Auth.cs/ConfigureAuth so ... Sie wird auf Microsoft.Owin.Cors brauchen

public void ConfigureAuth(IAppBuilder app) 
     { 
      app.UseCors(CorsOptions.AllowAll); 

Wenn Sie lieber Halten Sie es auf der Controller-Ebene, dann können Sie einfach auf der Controller-Ebene einfügen.

[EnableCors("http://localhost:24589", "*", "*")] 
    public class ProductsController : ApiController 
    { 
     ProductRepository _prodRepo; 
+0

In meinem Fall hatte ich es sowohl in Web.Config als auch in MyAppApiConfig.cs gesetzt. Das Entfernen von letzterem löste das Problem für mich. –

1

, wenn Sie in IIS sind, müssen Sie CORS in web.config aktivieren, dann müssen Sie nicht in App_Start/WebApiConfig.cs Register-Methode ermöglichen

Meine Lösung war, die Linien hier kommentiert :

// Enable CORS 
//EnableCorsAttribute cors = new EnableCorsAttribute("*", "*", "*"); 
//config.EnableCors(cors); 

und in der web.config schreiben:

<system.webServer> 
    <httpProtocol> 
    <customHeaders> 
    <add name="Access-Control-Allow-Origin" value="*" /> 
    </customHeaders> 
</httpProtocol>