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?


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.


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.


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 .


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


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.


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.


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: *


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;

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>


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


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"

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.


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 /


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


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


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 .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.