web-dev-qa-db-fra.com

L'en-tête 'Access-Control-Allow-Origin' contient plusieurs valeurs

J'utilise AngularJS $ http du côté client pour accéder à un noeud final d'une application API Web ASP.NET côté serveur. Comme le client est hébergé sur un domaine différent du serveur, j'ai besoin de CORS. Cela fonctionne pour $ http.post (url, data). Mais dès que j'authentifie l'utilisateur et que je pose une requête via $ http.get (url), je reçois le message

 L'en-tête 'Access-Control-Allow-Origin' contient plusieurs valeurs 'http://127.0.0.1:9000, http://127.0.0.1:9000', mais une seule est autorisée. Origin 'http://127.0.0.1:9000' n'est donc pas autorisé à accéder .

Fiddler me montre qu'il y a effectivement deux entrées d'en-tête dans la demande get après une demande d'options réussie. Quoi et où est-ce que je fais quelque chose de mal?

Mettre à jour

Lorsque j'utilise jQuery $ .get au lieu de $ http.get, le même message d'erreur apparaît. Cela ne semble donc pas poser de problème avec AngularJS. Mais où est le problème?

85
Papa Mufflon

Nous avons rencontré ce problème parce que nous avions configuré CORS conformément aux meilleures pratiques (par exemple, http://www.asp.net/web-api/overview/security/enabling-cross-cross-Origin-requests-in-web-api ) ET AUSSI eu un en-tête personnalisé <add name="Access-Control-Allow-Origin" value="*"/> dans web.config. 

Supprimez l'entrée web.config, et tout va bien. 

Contrairement à la réponse de @ mww, nous avons toujours EnableCors() dans WebApiConfig.cs ET une EnableCorsAttribute sur le contrôleur. Lorsque nous avons sorti l'un ou l'autre, nous avons rencontré d'autres problèmes.

43
Brandon Kuczenski

J'utilise Cors 5.1.0.0, après beaucoup de maux de tête, j'ai découvert que le problème était en double.

config.EnableCors() supprimé du fichier WebApiConfig.cs et il suffit de définir l'attribut [EnableCors("*","*","*")] sur la classe Controller

Vérifiez cet article pour plus de détails.

37
mww

Moi aussi, j'avais à la fois OWIN et mon WebAPI qui, à la fois, nécessitaient apparemment que CORS soit activé séparément, ce qui a à son tour créé l'erreur 'Access-Control-Allow-Origin' header contains multiple values.

J'ai fini par supprimer TOUS les codes qui activaient CORS, puis j'ai ajouté ce qui suit au noeud system.webServer de mon 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>

Faire cela satisfait aux exigences CORS pour OWIN (autoriser la connexion) et pour WebAPI (autoriser les appels API), mais cela a créé un nouveau problème: une méthode OPTIONS n'a pas été trouvée lors du contrôle en amont pour mes appels API. La solution à ce problème était simple: il me suffisait de supprimer les éléments suivants du noeud handlers de mon Web.Config:

<remove name="OPTIONSVerbHandler" />

J'espère que ça aide quelqu'un.

7
Matt Cashatt

En fait, vous ne pouvez pas définir plusieurs en-têtes Access-Control-Allow-Origin (ou du moins cela ne fonctionnera pas dans tous les navigateurs). À la place, vous pouvez définir de manière conditionnelle une variable d’environnement, puis l’utiliser dans la directive Header:

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

Ainsi, dans cet exemple, l'en-tête de réponse ne sera ajouté que si un en-tête de demande Origin correspond à RegExp: ^(https?://localhost|https://[a-z]+\.my\.base\.domain)$ (il s'agit essentiellement d'hôte local sur HTTP ou HTTPS et * .my.base.domain sur HTTPS).

N'oubliez pas d'activer le module setenvif.

Docs:

BTW. Le }e dans %{Origin_SUB_DOMAIN}e n'est pas une faute de frappe. C'est comment vous utilisez la variable d'environnement dans la directive Header.

5
Nux

Serveur Apache:

Je passe la même chose, mais c’est parce que je n’avais pas de guillemets (") l’astérisque dans mon fichier donnant accès au serveur, par exemple" .htaccess ". 

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

Vous pouvez également avoir un fichier '.htaccess' dans un dossier avec un autre '.htaccess', par exemple 

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

Dans votre cas, au lieu de "*", l'astérisque serait le serveur ip (http://127.0.0.1:9000) que vous autorisez à fournir des données.

ASP.NET:

Vérifiez qu'il n'y a pas de doublon 'Access-Control-Allow-Origin-Origin' dans votre code.

Outils de développement:

Avec Chrome, vous pouvez vérifier les en-têtes de votre demande. Appuyez sur la touche F12 et allez à l'onglet 'Réseau', exécutez maintenant la demande AJAX et apparaîtra dans la liste, cliquez sur et donnez toutes les informations qui s'y trouvent. 

Access-Control-Allow-Origin: *

5
Chofoteddy

Cela se produit lorsque l’option Cors est configurée à plusieurs endroits. Dans mon cas, je l'avais au niveau du contrôleur ainsi que dans le Startup.Auth.cs/ConfigureAuth.

Si j'ai bien compris, si vous voulez une application large, configurez-la simplement sous Startup.Auth.cs/ConfigureAuth comme ceci ... Vous aurez besoin d’une référence à Microsoft.Owin.Cors.

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

Si vous préférez le garder au niveau du contrôleur, vous pouvez simplement l'insérer au niveau du contrôleur.

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

si vous êtes dans IIS, vous devez activer CORS dans web.config. Vous n'avez pas besoin d'activer la méthode Register App_Start/WebApiConfig.cs

Ma solution a été, commenté les lignes ici:

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

et écrivez dans le web.config:

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

2
freedeveloper

Ajouter à l'enregistrement WebApiConfig

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

Ou 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>

MAIS PAS LES DEUX

2
tfa

vient d'avoir ce problème avec un serveur nodejs.

voici comment je l'ai corrigé.
J'exécute mon serveur de nœud via nginx proxy et je règle nginx et node à la fois sur allow cross domain requests.

1
James Harrington

Cela peut aussi arriver bien sûr si vous avez défini plusieurs en-tête dans votre en-tête Access-Control-Allow-Origin - Par exemple, une liste de valeurs séparées par des virgules, type pris en charge dans le RFC mais non pris en charge par la plupart principaux navigateurs. Notez que la RFC explique comment autoriser plusieurs domaines sans utiliser également le caractère '*'. 

Par exemple, vous pouvez obtenir cette erreur dans Chrome en utilisant un en-tête comme ceci:

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

C'était en Chrome Version 64.0.3282.186 (Official Build) (64-bit)

Notez que si vous envisagez cette opération à cause d'un CDN et que vous utilisez Akamai, notez que Akamai ne se mettra pas en cache sur le serveur si vous utilisezVary:Origin, comme beaucoup le suggèrent. 

Vous devrez probablement modifier le mode de construction de votre clé de cache, en utilisant un comportement de réponse "Modification d'ID de cache". Plus détails sur cette question dans cette question StackOverflow liée

1
Brad Parks

Si bête et simple:

Ce problème s’est produit lorsque j’ai eu deux fois Header always set Access-Control-Allow-Origin * dans mon fichier de configuration Apache. Une fois avec les balises VirtualHost et une fois dans une balise Limit:

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

Supprimer une entrée a résolu le problème.

Je suppose que dans le post original, cela aurait été deux fois:

Header set Access-Control-Allow-Origin: "http://127.0.0.1:9000"
0
Wilt

J'ai fait face au même problème et voici ce que j'ai fait pour le résoudre:

Dans le service WebApi, dans Global.asax, j'ai écrit le code suivant:

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

Ici, ce code autorise uniquement les demandes de pré-vol et de jetons à ajouter "Access-Control-Allow-Origin" dans la réponse, sinon je ne l'ajoute pas.

Voici mon blog sur la mise en œuvre: https://ibhowmick.wordpress.com/2018/09/21/cross-domain-token-based-authentication-with-web-api2-and-jquery-angular-5- angular-6/

0

pour ceux qui utilisent IIS avec php, sur IIS il met à jour le fichier web.config côté serveur dans le répertoire racine (wwwroot) et ajoute ceci 

<?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>

après le redémarrage du serveur IIS, tapez IISReset dans RUN et entrez 

0
user889030

Voici une autre instance similaire aux exemples ci-dessus, dans laquelle un seul fichier de configuration peut définir où CORS se trouve: Il y avait deux fichiers web.config sur le serveur IIS sur le chemin dans des répertoires différents, et l'un d'eux était masqué le répertoire virtuel . Pour le résoudre, j'ai supprimé le fichier de configuration du niveau racine car le chemin utilisait le fichier de configuration du répertoire virtuel . Je dois choisir l'un ou l'autre.

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
Cliff Coulter