Der Header 'Access-Control-Allow-Origin' enthält mehrere Werte

104

Ich verwende AngularJS $ http auf der Clientseite, um auf einen Endpunkt einer ASP.NET-Web-API-Anwendung auf der Serverseite zuzugreifen. Da der Client in einer anderen Domäne als der Server gehostet wird, benötige ich CORS. Es funktioniert für $ http.post (URL, Daten). Sobald ich den Benutzer authentifiziere und eine Anfrage über $ http.get (url) stelle, erhalte ich die Nachricht

Der Header 'Access-Control-Allow-Origin' enthält mehrere Werte 'http://127.0.0.1:9000, http://127.0.0.1:9000', aber nur einer ist zulässig. Origin 'http://127.0.0.1:9000' ist daher kein Zugriff gestattet.

Fiddler zeigt mir, dass die get-Anfrage nach einer erfolgreichen Optionsanforderung tatsächlich zwei Header-Einträge enthält. Was und wo mache ich etwas falsch?

Aktualisieren

Wenn ich jQuery $ .get anstelle von $ http.get verwende, wird dieselbe Fehlermeldung angezeigt. Dies scheint also kein Problem mit AngularJS zu sein. Aber wo ist es falsch?

Papa Mufflon
quelle
Was enthält der Header?
eckes

Antworten:

53

Ich fügte hinzu

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

ebenso gut wie

app.UseCors(CorsOptions.AllowAll);

auf dem Server. Dies führt zu zwei Header-Einträgen. Verwenden Sie einfach die letztere und es funktioniert.

Papa Mufflon
quelle
4
Anscheinend lesen Sie Properties.Settings.Default.Cors aus einer Einstellungsdatei. Können Sie ein Beispiel posten? Und in welcher Klasse ist UseCors?
Hoppe
"Nicht erfasster Referenzfehler: EnableCorsAttribute ist nicht definiert" ??
Schaltung
@Hoppe, bitte schauen Sie unter msdn.microsoft.com/en-us/library/dn314597(v=vs.118).aspx nach . Es wird erklärt, dass der erste Parameter des EnableCorsAttribute die zulässigen Ursprünge sind. Zum Beispiel "*", um alle zuzulassen.
Papa Mufflon
1
@Hoppe, UseCors ist eine Erweiterungsmethode, die im NuGet-Paket Microsoft.Owin.Cors definiert ist. Sf katanaproject.codeplex.com/SourceControl/latest#src/… .
Papa Mufflon
7
config.EnableCors (enableCorsAttribute) wird normalerweise in WebApiConfig.cs aufgerufen - es ist Teil des Microsoft.AspNet.WebApi.Cors Nuget-Pakets, dessen Verwendung hier beschrieben wird: asp.net/web-api/overview/security/… app .UseCors (CorsOptions.AllowAll) wird normalerweise in Startup.Auth.cs als Teil der Konfiguration Ihres Identitätsanbieters (z. B. OAuth) aufgerufen und ist Teil des Microsoft.Owin.Cors Nuget-Pakets.
Henry C
51

Wir sind auf dieses Problem gestoßen, weil wir CORS gemäß den Best Practices eingerichtet hatten (z. B. http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api ) UND AUCH hatte einen benutzerdefinierten Header <add name="Access-Control-Allow-Origin" value="*"/>in web.config.

Entfernen Sie den Eintrag web.config, und alles ist in Ordnung.

Im Gegensatz zu @ mwws Antwort haben wir immer noch EnableCors()in der WebApiConfig.cs UND eine EnableCorsAttributeauf dem Controller. Als wir den einen oder anderen herausgenommen haben, sind wir auf andere Probleme gestoßen.

Brandon Kuczenski
quelle
11
Ich habe diese Zeile <add name = "Access-Control-Allow-Origin" value = "*" /> entfernt und die folgenden beiden anderen Einträge in der Datei web.config entfernt, die ich nicht entfernt habe: <add name = "Access -Control-Allow-Headers "value =" Content-Type "/> <add name =" Zugriffssteuerungs-Allow-Methoden "value =" GET, POST, PUT, DELETE, OPTIONS "/>
Siva Karthikeyan
2
Dies ist der Schlüssel, Sie müssen CORS nur einmal aktivieren. Mein Problem war, dass ich es auch in meiner web.config sowie in app.UseCors () aktiviert hatte. Ich habe den Eintrag web.config entfernt und nur die app.UseCors verwendet (Microsoft.Owin.Cors.CorsOptions.AllowAll); Methode stattdessen.
Mohammad Sepahvand
1
Die obige Zeile hat mir das Leben gerettet! Stellen Sie sicher, dass Sie CORS nicht mehr als einmal aktivieren, da dies sonst passieren und Sie sehr frustriert werden.
TGarrett
entfernte den <add name = "Access-Control-Allow-Headers" value = "Content-Type" /> aus web.config und korrigierte ihn für mich
jbooker
1
"Dies ist der Schlüssel, Sie müssen CORS nur einmal aktivieren" <- DAS IST ES @MohammadSepahvund DANKE. Zurück zu .NET und schon überrascht: D.
Tuan Jinn
42

Ich verwende Cors 5.1.0.0. Nach vielen Kopfschmerzen habe ich festgestellt, dass das Problem darin besteht, dass die Header Access-Control-Allow-Origin und Access-Control-Allow-Header vom Server dupliziert werden

Aus config.EnableCors()der Datei WebApiConfig.cs entfernt und nur das [EnableCors("*","*","*")]Attribut für die Controller-Klasse festgelegt

Weitere Informationen finden Sie in diesem Artikel .

mww
quelle
Dies funktioniert für mich. Stellen Sie nur sicher, dass Sie in web.config
Crismogram
12

Zur Registrierung hinzufügen WebApiConfig

var cors = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);

Oder web.config

<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" />
<add name="Access-Control-Allow-Credentials" value="true" />
</customHeaders>  
</httpProtocol>

ABER NICHT BEIDE

tfa
quelle
2
Dies war die Schlüssellösung für mich, machen Sie nicht beides.
Robnick
8

Eigentlich können Sie nicht mehrere Header setzen Access-Control-Allow-Origin(oder zumindest funktioniert es nicht in allen Browsern). Stattdessen können Sie eine Umgebungsvariable bedingt festlegen und dann in der HeaderDirektive 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

In diesem Beispiel wird der Antwortheader nur hinzugefügt, wenn ein Anforderungsheader Originmit RegExp übereinstimmt: ^(https?://localhost|https://[a-z]+\.my\.base\.domain)$(Dies bedeutet im Grunde localhost über HTTP oder HTTPS und * .my.base.domain über HTTPS).

Denken Sie daran, das setenvifModul zu aktivieren .

Docs:

Übrigens. Das }eIn %{ORIGIN_SUB_DOMAIN}eist kein Tippfehler. So verwenden Sie Umgebungsvariablen in der HeaderDirektive.

Nux
quelle
1
Haben Sie eine Quelle, um nicht mehrere Zugriffssteuerungsheader festzulegen? Ich kann nichts finden, was dies bestätigt.
Spencer
Sehr intelligente und saubere Lösung. Hat für mich gearbeitet.
Alex Kalmikov
@Spencer "Hinweis: In der Praxis ist die Produktion von Ursprungslisten oder Nullen eingeschränkter. Anstatt eine durch Leerzeichen getrennte Liste von Ursprüngen zuzulassen, handelt es sich entweder um einen einzelnen Ursprung oder um die Zeichenfolge" Null " ." w3.org/TR/cors/#access-control-allow-origin-response-header
Nux
8

Auch ich hatte sowohl OWIN als auch meine WebAPI, für die beide anscheinend CORS separat aktiviert haben mussten, was wiederum den 'Access-Control-Allow-Origin' header contains multiple valuesFehler verursachte.

system.webServerAm Ende habe ich ALLEN Code entfernt, der CORS aktiviert hat, und dann dem Knoten meiner Web.Config Folgendes hinzugefügt:

<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 wurden die CORS-Anforderungen für OWIN (Anmeldung zulassen) und WebAPI (API-Aufrufe zulassen) erfüllt, es entstand jedoch ein neues Problem: OPTIONSWährend des Preflights konnte für meine API-Aufrufe keine Methode gefunden werden. Die Lösung dafür war einfach: Ich musste nur Folgendes vom handlersKnoten my Web.Config entfernen:

<remove name="OPTIONSVerbHandler" />

Hoffe das hilft jemandem.

Matt Cashatt
quelle
7

Apache Server:

Ich gebe das gleiche aus, aber es lag daran, dass ich keine Anführungszeichen (") für das Sternchen in meiner Datei hatte, das den Zugriff auf den Server ermöglichte, z. B." .htaccess ".

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

Möglicherweise haben Sie auch eine Datei '.htaccess' in einem Ordner mit einem anderen '.htaccess', z

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

In Ihrem Fall ist anstelle von '*' das Sternchen der ip ( http://127.0.0.1:9000) - Server, auf dem Sie die Berechtigung zum Bereitstellen von Daten erteilen.

ASP.NET:

Stellen Sie sicher, dass Ihr Code kein Duplikat "Access-Control-Allow-Origin" enthält.

Entwicklerwerkzeuge:

Mit Chrome können Sie Ihre Anforderungsheader überprüfen. Drücken Sie die Taste F12 und gehen Sie zur Registerkarte "Netzwerk". Führen Sie nun die AJAX-Anforderung aus. Sie wird in der Liste angezeigt. Klicken Sie auf und geben Sie alle dort enthaltenen Informationen an.

Zugriffskontrolle-Zulassen-Ursprung: *

Chofoteddy
quelle
Manchmal ist es so einfach ... Während ich versuchte, diesen verwirrten Webdienst auf IIS / Chrome zum Laufen zu bringen, spielte ich mit der Application_BeginRequest-Methode herum und vergaß es ... Duplizierung in meinem eigenen Code! Danke, dass du mich auf das Offensichtliche hingewiesen hast! :)
Jürgen Riemer
2
Um die CORS-Antwortheader abzurufen, müssen Sie auch eine tatsächliche Ursprungsanforderung simulieren, sodass sie möglicherweise nicht angezeigt wird, wenn Sie nur auf der Registerkarte "Netzwerk" auf der ausgeführten Site nachsehen. Wenn Sie jedoch etwas wie DHC ( chrome.google.com/webstore/detail/dhc-resthttp-api-client/… ) verwenden, um Ihre AJAX-Anfrage auszuführen, wird technisch von einer anderen Domain aus angerufen, wodurch CORS ausgelöst wird und Sie sehen können die Access Control-Header.
Henry C
4

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

Mein Verständnis ist, wenn Sie es anwendungsweit möchten, konfigurieren Sie es einfach unter Startup.Auth.cs / ConfigureAuth wie folgt ... Sie benötigen einen Verweis auf Microsoft.Owin.Cors

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

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

[EnableCors("http://localhost:24589", "*", "*")]
    public class ProductsController : ApiController
    {
        ProductRepository _prodRepo;
Nizar
quelle
In meinem Fall hatte ich es sowohl in Web.Config als auch in MyAppApiConfig.cs eingestellt. Das Entfernen von letzterem löste das Problem für mich.
Jim B
4

Wenn Sie sich in IIS befinden, müssen Sie CORS in web.config aktivieren, und Sie müssen es nicht in der Registrierungsmethode App_Start / WebApiConfig.cs aktivieren

Meine Lösung war, kommentierte die Zeilen hier:

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

und schreibe in die web.config:

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

freedeveloper
quelle
2

Dies kann natürlich auch passieren, wenn Sie Ihren Access-Control-Allow-OriginHeader tatsächlich auf mehrere Werte festgelegt haben - z. B. eine durch Kommas getrennte Liste von Werten, die im RFC unterstützt wird, von den meisten gängigen Browsern jedoch nicht unterstützt wird. Beachten Sie, dass der RFC darüber spricht, wie Sie mehr als eine Domain zulassen können, ohne auch '*' zu verwenden.

Sie können diesen Fehler beispielsweise in Chrome mithilfe eines Headers wie folgt erhalten:

Access-Control-Allow-Origin: http://test.mysite.com, http://test2.mysite.com

Das war in Chrome Version 64.0.3282.186 (Official Build) (64-bit)

Beachten Sie, dass Sie, wenn Sie dies aufgrund eines CDN in Betracht ziehen und Akamai verwenden, möglicherweise beachten möchten, dass Akamai bei der Verwendung nicht auf dem Server zwischengespeichert wird Vary:Origin , wie es viele zur Lösung dieses Problems vorschlagen.

Wahrscheinlich müssen Sie die Erstellung Ihres Cache-Schlüssels mithilfe des Antwortverhaltens "Cache ID Modification" ändern. Weitere Details zu diesem Problem finden Sie in dieser verwandten StackOverflow-Frage

Brad Parks
quelle
Grundsätzlich können Sie dies derzeit nicht tun, da es zweifelhaft ist, ob jede einzelne Domain im Internet auf die URL zugreifen soll.
Scottheckel
Der Akamai-Link muss angemeldet sein.
Jean-François Savard
Ja, das scheint eine Akamai-Anforderung für diese Dokumente zu sein.
Brad Parks
Eine andere Möglichkeit, diesen Fehler in Chrome zu erhalten, ist eine durch Leerzeichen getrennte Liste von Werten : Access-Control-Allow-Origin: http://test.mysite.com http://test2.mysite.com. Das wäre der richtige Weg, aber Browser folgen hier nicht dem Standard ( Quelle ).
Tanius
2

So dumm und einfach:

Dieses Problem trat bei mir auf, als ich zwei Mal Header always set Access-Control-Allow-Origin *in meiner Apache-Konfigurationsdatei war. Einmal mit den VirtualHostTags und einmal in einem LimitTag:

<VirtualHost localhost:80>
  ...
  Header set Access-Control-Allow-Origin: *
  ...
  <Limit OPTIONS>
    ...
    Header set Access-Control-Allow-Origin: *
    ...
  </Limit>
</VirtualHost>

Durch Entfernen eines Eintrags wurde das Problem behoben.

Ich denke, im ursprünglichen Beitrag wäre es zweimal gewesen:

Header set Access-Control-Allow-Origin: "http://127.0.0.1:9000"
Verwelken
quelle
1

Hatte gerade dieses Problem mit einem NodeJS-Server.

Hier ist, wie ich es behoben habe.
Ich starte meinen Knotenserver über a nginx proxyund setze nginx und nodeauf beide allow cross domain requestsund es hat mir nicht gefallen, also habe ich ihn aus nginx entfernt und im Knoten belassen und alles war gut.

James Harrington
quelle
Vielen Dank für diese Antwort! Es löste ein Problem, das ich mit einem Nginx + Rack (Ruby) Setup lange Zeit nicht lösen konnte. Gleiches Problem, gleiche Lösung: Deaktivieren Sie die Header-Ergänzungen in Nginx und lassen Sie den rack-corsEdelstein das CORS-Zeug erledigen. Bam, behoben.
Pistos
0

Ich habe das gleiche Problem und dies habe ich getan, um es zu lösen:

Im WebApi-Dienst habe ich in Global.asax den folgenden Code geschrieben:

Sub Application_BeginRequest()
        Dim currentRequest = HttpContext.Current.Request
        Dim currentResponse = HttpContext.Current.Response

        Dim currentOriginValue As String = String.Empty
        Dim currentHostValue As String = String.Empty

        Dim currentRequestOrigin = currentRequest.Headers("Origin")
        Dim currentRequestHost = currentRequest.Headers("Host")

        Dim currentRequestHeaders = currentRequest.Headers("Access-Control-Request-Headers")
        Dim currentRequestMethod = currentRequest.Headers("Access-Control-Request-Method")

        If currentRequestOrigin IsNot Nothing Then
            currentOriginValue = currentRequestOrigin
        End If

        If currentRequest.Path.ToLower().IndexOf("token") > -1 Or Request.HttpMethod = "OPTIONS" Then
            currentResponse.Headers.Remove("Access-Control-Allow-Origin")
            currentResponse.AppendHeader("Access-Control-Allow-Origin", "*")
        End If

        For Each key In Request.Headers.AllKeys
            If key = "Origin" AndAlso Request.HttpMethod = "OPTIONS" Then
                currentResponse.AppendHeader("Access-Control-Allow-Credentials", "true")
                currentResponse.AppendHeader("Access-Control-Allow-Methods", currentRequestMethod)
                currentResponse.AppendHeader("Access-Control-Allow-Headers", If(currentRequestHeaders, "GET,POST,PUT,DELETE,OPTIONS"))
                currentResponse.StatusCode = 200
                currentResponse.End()
            End If
        Next

    End Sub

Hier erlaubt dieser Code nur vor dem Flug und bei der Token-Anforderung, "Access-Control-Allow-Origin" in die Antwort aufzunehmen, andernfalls füge ich ihn nicht hinzu.

Hier ist mein Blog über die Implementierung: https://ibhowmick.wordpress.com/2018/09/21/cross-domain-token-based-authentication-with-web-api2-and-jquery-angular-5-angular- 6 /

Indranil Bhowmick
quelle
0

Für diejenigen, die IIS mit PHP verwenden, aktualisieren Sie auf IIS it serverseitig die Datei web.config im Stammverzeichnis (wwwroot) und fügen Sie diese hinzu

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <directoryBrowse enabled="true" />
        <httpProtocol>
            <customHeaders>
                <add name="Control-Allow-Origin" value="*"/>
            </customHeaders>
        </httpProtocol>
    </system.webServer>
</configuration>

Geben Sie nach dem Neustart des IIS-Servers IISReset in RUN ein und geben Sie ein

user889030
quelle
0

Hier ist eine weitere Instanz ähnlich den obigen Beispielen, in der möglicherweise nur eine Konfigurationsdatei definiert ist, in der sich CORS befindet: Auf dem IIS-Server befanden sich zwei web.config-Dateien auf dem Pfad in verschiedenen Verzeichnissen, von denen eine im virtuellen Verzeichnis ausgeblendet war. Um dies zu lösen, habe ich die Konfigurationsdatei auf Stammebene gelöscht, da der Pfad die Konfigurationsdatei im virtuellen Verzeichnis verwendete. Müssen den einen oder anderen wählen.

URL called:  'https://example.com/foo/bar'
                     ^              ^
      CORS config file in root      virtual directory with another CORS config file
          deleted this config             other sites using this

Cliff Coulter
quelle
0

Der Header 'Access-Control-Allow-Origin' enthält mehrere Werte

Als ich diesen Fehler erhielt, verbrachte ich Tonnen von Stunden damit, nach einer Lösung dafür zu suchen, aber nichts funktioniert. Schließlich fand ich eine Lösung für dieses Problem, die sehr einfach ist. Wenn der Header "Access-Control-Allow-Origin" mehr als einmal zu Ihrer Antwort hinzugefügt wurde, tritt dieser Fehler auf. Überprüfen Sie die serverseitige Skriptdatei apache.conf oder httpd.conf (Apache-Server) und entfernen Sie unerwünschte Eintragsheader aus diesen Dateien .

Jiten Mhatre
quelle