L'intestazione "Access-Control-Allow-Origin" contiene più valori


104

Sto usando AngularJS $ http sul lato client per accedere a un endpoint di un'applicazione API Web ASP.NET sul lato server. Poiché il client è ospitato su un dominio diverso dal server, ho bisogno di CORS. Funziona per $ http.post (url, data). Ma non appena autentico l'utente e faccio una richiesta tramite $ http.get (url), ricevo il messaggio

L'intestazione "Access-Control-Allow-Origin" contiene più valori "http://127.0.0.1:9000, http://127.0.0.1:9000", ma solo uno è consentito. L'accesso all'origine "http://127.0.0.1:9000" non è pertanto consentito.

Fiddler mi mostra che ci sono effettivamente due voci di intestazione nella richiesta get dopo una richiesta di opzioni riuscita. Cosa e dove sto facendo qualcosa di sbagliato?

Aggiornare

Quando utilizzo jQuery $ .get invece di $ http.get, viene visualizzato lo stesso messaggio di errore. Quindi questo non sembra alcun problema con AngularJS. Ma dov'è che non va?


Bene, cosa contiene l'intestazione?
Eckes

Risposte:


53

Ho aggiunto

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

così come

app.UseCors(CorsOptions.AllowAll);

sul server. Ciò si traduce in due voci di intestazione. Basta usare quest'ultimo e funziona.


4
Sembra che tu stia leggendo Properties.Settings.Default.Cors da un file di impostazioni. Puoi pubblicare un esempio? E in che classe è UseCors?
Hoppe

"Errore di riferimento non rilevato: EnableCorsAttribute non è definito" ??
circuiteria

@ Hoppe, dai un'occhiata a msdn.microsoft.com/en-us/library/dn314597(v=vs.118).aspx . Spiega che il primo parametro di EnableCorsAttribute sono le origini consentite. Ad esempio "*" per consentire tutto.
Papa Mufflon

1
@Hoppe, UseCors è un metodo di estensione definito nel pacchetto NuGet Microsoft.Owin.Cors. Sf katanaproject.codeplex.com/SourceControl/latest#src/… .
Papa Mufflon

7
config.EnableCors (enableCorsAttribute) viene solitamente chiamato in WebApiConfig.cs - fa parte del pacchetto Microsoft.AspNet.WebApi.Cors Nuget, il cui utilizzo è descritto qui: asp.net/web-api/overview/security/… app .UseCors (CorsOptions.AllowAll) viene solitamente chiamato in Startup.Auth.cs come parte della configurazione del provider di identità (ad esempio OAuth) e fa parte del pacchetto Microsoft.Owin.Cors Nuget.
Henry C

51

Abbiamo riscontrato questo problema perché avevamo impostato CORS secondo le migliori pratiche (ad esempio http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api ) E INOLTRE aveva un'intestazione personalizzata <add name="Access-Control-Allow-Origin" value="*"/>in web.config.

Rimuovi la voce web.config e tutto va bene.

Contrariamente alla risposta di @ mww, abbiamo ancora EnableCors()in WebApiConfig.cs E un EnableCorsAttributesul controller. Quando abbiamo eliminato l'uno o l'altro, abbiamo riscontrato altri problemi.


11
Ho rimosso questa riga <add name = "Access-Control-Allow-Origin" value = "*" /> e avevo le seguenti altre due voci nel file web.config che non ho rimosso: <add name = "Access -Control-Allow-Headers "value =" Content-Type "/> <add name =" Access-Control-Allow-Methods "value =" GET, POST, PUT, DELETE, OPTIONS "/>
Siva Karthikeyan

2
Questa è la chiave, devi abilitare CORS solo una volta, il mio problema era che l'avevo abilitato anche nel mio web.config e app.UseCors () ... Ho rimosso la voce web.config e ho appena usato l'app.UseCors (Microsoft.Owin.Cors.CorsOptions.AllowAll); metodo invece.
Mohammad Sepahvand

1
La riga sopra mi ha salvato la vita! Assicurati di non abilitare CORS più di una volta, altrimenti accadrà e diventerai molto frustrato.
TGarrett

rimosso il <add name = "Access-Control-Allow-Headers" value = "Content-Type" /> da web.config e risolto per me
jbooker

1
"Questa è la chiave, devi abilitare CORS solo una volta" <- QUESTO È @MohammadSepahvand GRAZIE. Tornato a .NET e già colto di sorpresa: D.
Tuan Jinn

42

Sto usando Cors 5.1.0.0, dopo molto mal di testa, ho scoperto che il problema era duplicato nelle intestazioni Access-Control-Allow-Origin e Access-Control-Allow-Header dal server

Rimosso config.EnableCors()dal file WebApiConfig.cs e impostato solo l' [EnableCors("*","*","*")]attributo sulla classe Controller

Controlla questo articolo per maggiori dettagli.


questo funziona per me, assicurati solo di non impostarne un altro come questo <add name = "Access-Control-Allow-Origin" value = "*" /> in web.config
Crismogram

12

Aggiungi a Register WebApiConfig

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

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

MA NON ENTRAMBI


2
Questa è stata la soluzione chiave per me, non fare entrambe le cose.
robnick

8

In realtà non puoi impostare più intestazioni Access-Control-Allow-Origin(o almeno non funzionerà in tutti i browser). Invece puoi impostare in modo condizionale una variabile di ambiente e quindi usarla nella Headerdirettiva:

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

Quindi, in questo esempio, l'intestazione della risposta verrà aggiunta solo se un'intestazione della richiesta Origincorrisponde a RegExp: ^(https?://localhost|https://[a-z]+\.my\.base\.domain)$(in pratica significa localhost su HTTP o HTTPS e * .my.base.domain su HTTPS).

Ricordati di abilitare il setenvifmodulo.

Documenti:

BTW. L' }ein %{ORIGIN_SUB_DOMAIN}enon è un errore di battitura. È il modo in cui usi la variabile d'ambiente nella Headerdirettiva.


1
Hai una fonte per non impostare più intestazioni di controllo degli accessi? Non riesco a trovare nulla che lo confermi.
Spencer

Soluzione molto intelligente e pulita. Ha funzionato per me.
Alex Kalmikov

@Spencer "Nota: in pratica la produzione dell'elenco delle origini o del valore null è più vincolata. Piuttosto che consentire un elenco di origini separate da spazi, è una singola origine o la stringa" null " ." w3.org/TR/cors/#access-control-allow-origin-response-header
Nux

8

Anch'io avevo sia OWIN che la mia WebAPI che apparentemente avevano bisogno di CORS abilitati separatamente, il che a sua volta ha creato l' 'Access-Control-Allow-Origin' header contains multiple valueserrore.

Ho finito per rimuovere TUTTO il codice che abilitava CORS e quindi ho aggiunto quanto segue al system.webServernodo del mio 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>

Ciò ha soddisfatto i requisiti CORS per OWIN (che consente l'accesso) e per WebAPI (che consente le chiamate API), ma ha creato un nuovo problema: OPTIONSnon è stato possibile trovare un metodo durante il preflight per le mie chiamate API. La soluzione era semplice: dovevo solo rimuovere quanto segue dal handlersnodo my Web.Config:

<remove name="OPTIONSVerbHandler" />

Spero che questo aiuti qualcuno.


7

Server Apache:

Ho speso lo stesso, ma è stato perché non avevo virgolette (") l'asterisco nel mio file che ha fornito l'accesso al server, ad esempio '.htaccess.':

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

Potresti anche avere un file ".htaccess" in una cartella con un altro ".htaccess" fuori, ad es

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

Nel tuo caso invece di '*' l'asterisco sarebbe il http://127.0.0.1:9000server ip ( ) a cui dai il permesso di fornire dati.

ASP.NET:

Verifica che non ci siano duplicati "Access-Control-Allow-Origin" nel tuo codice.

Strumenti di sviluppo:

Con Chrome puoi verificare le intestazioni della tua richiesta. Premi il tasto F12 e vai alla scheda "Rete", ora esegui la richiesta AJAX e apparirà nell'elenco, fai clic e dai tutte le informazioni che ci sono.

Access-Control-Allow-Origin: *


A volte è così facile ... Mentre cercavo di far funzionare quei servizi web confusi su IIS / Chrome, ho giocato con il metodo Application_BeginRequest e me ne sono dimenticato ... duplicazione nel mio codice! Grazie per avermi indicato l'ovvio! :)
Juergen Riemer

2
Per ottenere le intestazioni di risposta CORS, dovrai anche simulare un'effettiva richiesta cross-origin, quindi potrebbe non apparire se guardi semplicemente nella scheda di rete sul sito in esecuzione. Tuttavia, l'utilizzo di qualcosa come DHC ( chrome.google.com/webstore/detail/dhc-resthttp-api-client/… ) per eseguire la tua richiesta AJAX tecnicamente chiamerà da un dominio diverso, attivando CORS e permettendoti di vedere le intestazioni di controllo di accesso.
Henry C

4

Ciò accade quando l'opzione Cors è configurata in più posizioni. Nel mio caso l'ho avuto a livello di controller così come in Startup.Auth.cs / ConfigureAuth.

La mia comprensione è che se lo desideri a livello di applicazione, configuralo in Startup.Auth.cs / ConfigureAuth in questo modo ... Avrai bisogno di un riferimento a Microsoft.Owin.Cors

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

Se preferisci mantenerlo a livello di controller, puoi semplicemente inserirlo a livello di controller.

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

Nel mio caso l'ho impostato sia in Web.Config che in MyAppApiConfig.cs. Rimuoverlo da quest'ultimo ha risolto il problema per me.
Jim B

4

se sei in IIS devi attivare CORS in web.config, quindi non devi abilitarlo in App_Start / WebApiConfig.cs Metodo di registrazione

La mia soluzione è stata, ha commentato le righe qui:

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

e scrivi nel web.config:

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


2

Questo può accadere ovviamente anche se hai effettivamente impostato la tua Access-Control-Allow-Originintestazione per avere più valori - Ad esempio, un elenco di valori separati da virgole, che è un po 'supportato nella RFC ma non è effettivamente supportato dalla maggior parte dei principali browser. Si noti che la RFC parla di come consentire più di un dominio senza utilizzare anche "*".

Ad esempio, puoi ottenere quell'errore in Chrome utilizzando un'intestazione in questo modo:

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

Questo era dentro Chrome Version 64.0.3282.186 (Official Build) (64-bit)

Tieni presente che se lo stai considerando a causa di un CDN e utilizzi Akamai, potresti voler notare che Akamai non memorizzerà nella cache il server se lo utilizzi Vary:Origin , come molti suggeriscono per risolvere questo problema.

Probabilmente dovrai modificare il modo in cui viene creata la chiave della cache, utilizzando un comportamento di risposta "Modifica ID cache". Maggiori dettagli su questo problema in questa domanda StackOverflow correlata


Quindi, in pratica, non puoi in questo momento perché è dubbio che vorrai che ogni singolo dominio su Internet raggiunga l'URL.
scottheckel

Il collegamento Akamai richiede l'accesso.
Jean-François Savard

sì, sembra essere un requisito akamai per quei documenti ;-(
Brad Parks

Un altro modo per ottenere questo errore in Chrome è un elenco separato da spazi di valori: Access-Control-Allow-Origin: http://test.mysite.com http://test2.mysite.com. Questo sarebbe il modo corretto, ma i browser non seguono lo standard qui ( fonte ).
tanius

2

Così stupido e semplice:

Questo problema si è verificato per me quando ho trascorso due volte Header always set Access-Control-Allow-Origin *nel mio file di configurazione di Apache. Una VirtualHostvolta all'interno dei tag e una volta all'interno di un Limittag:

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

La rimozione di una voce ha risolto il problema.

Immagino che nel post originale sarebbero state due volte:

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

1

ho appena avuto questo problema con un server nodejs.

ecco come l'ho risolto.
Ho eseguito il mio server nodo tramite a nginx proxye ho impostato nginx e nodesu entrambi allow cross domain requestse non è piaciuto così l'ho rimosso da nginx e l'ho lasciato in node ed è andato tutto bene.


Grazie per questa risposta! Ha risolto un problema che non riuscivo a risolvere per molto tempo con una configurazione nginx + Rack (Ruby). Stesso problema, stessa soluzione: disattiva le aggiunte di intestazione in nginx e lascia che il rack-corsgem gestisca le cose CORS. Bam, fisso.
Pistos

0

Ho affrontato lo stesso problema e questo è quello che ho fatto per risolverlo:

Nel servizio WebApi, all'interno di Global.asax ho scritto il seguente codice:

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

Qui questo codice consente solo la richiesta di pre-volo e token di aggiungere "Access-Control-Allow-Origin" nella risposta altrimenti non lo sto aggiungendo.

Ecco il mio blog sull'implementazione: https://ibhowmick.wordpress.com/2018/09/21/cross-domain-token-based-authentication-with-web-api2-and-jquery-angular-5-angular- 6 /


0

per coloro che utilizzano IIS con php, su IIS it lato server aggiorna il file web.config nella directory principale (wwwroot) e aggiungi questo

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

dopo di che riavviare il server IIS, digitare IISReset in RUN e immettere


0

Ecco un'altra istanza simile agli esempi precedenti in cui potresti avere un solo file di configurazione che definisce dove si trova CORS: C'erano due file web.config sul server IIS sul percorso in directory diverse e uno di loro era nascosto nella directory virtuale. Per risolverlo ho cancellato il file di configurazione a livello di root poiché il percorso utilizzava il file di configurazione nella directory virtuale. Devo scegliere l'uno o l'altro.

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

L'intestazione "Access-Control-Allow-Origin" contiene più valori

quando ho ricevuto questo errore ho passato tonnellate di ore a cercare una soluzione per questo ma non funziona niente, finalmente ho trovato la soluzione a questo problema che è molto semplice. quando l'intestazione "Access-Control-Allow-Origin" viene aggiunta più di una volta alla tua risposta, si verifica questo errore, controlla il tuo apache.conf o httpd.conf (server Apache), lo script lato server e rimuovi l'intestazione della voce indesiderata da questi file .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.