Estou usando AngularJS $ http no lado do cliente para acessar um ponto de extremidade de um aplicativo ASP.NET Web API no lado do servidor. Como o cliente está hospedado em um domínio diferente do servidor, preciso do CORS. Ele funciona para $ http.post (url, dados). Mas assim que eu autentico o usuário e faço uma solicitação via $ http.get (url), recebo a mensagem
O cabeçalho 'Access-Control-Allow-Origin' contém vários valores 'http://127.0.0.1:9000, http://127.0.0.1:9000', mas apenas um é permitido. Origem 'http://127.0.0.1:9000', portanto, não tem acesso permitido.
O Fiddler me mostra que há realmente duas entradas de cabeçalho na solicitação get após uma solicitação de opções bem-sucedida. O que e onde estou fazendo algo errado?
Atualizar
Quando eu uso jQuery $ .get em vez de $ http.get, a mesma mensagem de erro aparece. Portanto, isso não parece ser um problema com o AngularJS. Mas onde está errado?
asp.net-web-api
cors
angularjs-http
Papa Mufflon
fonte
fonte
Respostas:
Eu adicionei
config.EnableCors(new EnableCorsAttribute(Properties.Settings.Default.Cors, "", ""))
assim como
app.UseCors(CorsOptions.AllowAll);
no servidor. Isso resulta em duas entradas de cabeçalho. Basta usar o último e funciona.
fonte
Encontramos esse problema porque configuramos o CORS de acordo com a prática recomendada (por exemplo, http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api ) E TAMBÉM tinha um cabeçalho personalizado
<add name="Access-Control-Allow-Origin" value="*"/>
em web.config.Remova a entrada web.config e tudo ficará bem.
Ao contrário da resposta de @mww, ainda temos
EnableCors()
no WebApiConfig.cs E umEnableCorsAttribute
no controlador. Quando eliminamos um ou outro, encontramos outros problemas.fonte
Estou usando Cors 5.1.0.0, depois de muita dor de cabeça, descobri que o problema era duplicar os cabeçalhos Access-Control-Allow-Origin e Access-Control-Allow-Header do servidor
Removido
config.EnableCors()
do arquivo WebApiConfig.cs e apenas definido o[EnableCors("*","*","*")]
atributo na classe ControllerVerifique este artigo para mais detalhes.
fonte
Adicionar para registrar WebApiConfig
Ou web.config
MAS NÃO AMBOS
fonte
Na verdade, você não pode definir vários cabeçalhos
Access-Control-Allow-Origin
(ou pelo menos não funcionará em todos os navegadores). Em vez disso, você pode definir condicionalmente uma variável de ambiente e usá-la naHeader
diretiva:Portanto, neste exemplo, o cabeçalho de resposta será adicionado apenas se um cabeçalho de solicitação
Origin
corresponder a RegExp:^(https?://localhost|https://[a-z]+\.my\.base\.domain)$
(basicamente significa localhost sobre HTTP ou HTTPS e * .my.base.domain sobre HTTPS).Lembre-se de habilitar o
setenvif
módulo.Docs:
BTW. O
}e
in%{ORIGIN_SUB_DOMAIN}e
não é um erro de digitação. É como você usa a variável de ambiente naHeader
diretiva.fonte
Eu também tinha OWIN e meu WebAPI que aparentemente precisavam do CORS habilitado separadamente, o que por sua vez criou o
'Access-Control-Allow-Origin' header contains multiple values
erro.Acabei removendo TODOS os códigos que ativavam o CORS e adicionei o seguinte ao
system.webServer
nó do meu Web.Config:Fazer isso satisfazia os requisitos de CORS para OWIN (permitindo login) e para WebAPI (permitindo chamadas de API), mas criou um novo problema: um
OPTIONS
método não pôde ser encontrado durante a comprovação para minhas chamadas de API. A correção para isso foi simples - eu só precisava remover o seguinte dohandlers
nó do meu Web.Config:Espero que isso ajude alguém.
fonte
Servidor Apache:
Eu gastei o mesmo, mas foi porque eu não tinha aspas (") o asterisco em meu arquivo que fornecia acesso ao servidor, por exemplo '.htaccess.':
Você também pode ter um arquivo '.htaccess' em uma pasta com outro '.htaccess', por exemplo
No seu caso, em vez de '*' asterisco seria o ip (
http://127.0.0.1:9000
servidor ) que você dá permissão para servir os dados.ASP.NET:
Verifique se não há duplicata 'Access-Control-Allow-Origin' em seu código.
Ferramentas de desenvolvimento:
Com o Chrome, você pode verificar seus cabeçalhos de solicitação. Pressione a tecla F12 e vá até a aba 'Rede', agora execute a solicitação AJAX e aparecerá na lista, clique e dê todas as informações ali.
fonte
Isso acontece quando você tem a opção Cors configurada em vários locais. No meu caso, eu o tinha no nível do controlador, bem como no Startup.Auth.cs / ConfigureAuth.
Pelo que entendi, se você quiser que ele se aplique em todo o aplicativo, basta configurá-lo em Startup.Auth.cs / ConfigureAuth assim ... Você precisará de referência a Microsoft.Owin.Cors
Se você preferir mantê-lo no nível do controlador, pode apenas inseri-lo no nível do controlador.
fonte
se você estiver no IIS, você precisa ativar o CORS em web.config, então não precisa habilitar no método App_Start / WebApiConfig.cs Register
Minha solução foi, comentei as falas aqui:
e escreva no web.config:
fonte
Isso também pode acontecer, é claro, se você realmente definiu seu
Access-Control-Allow-Origin
cabeçalho para ter vários valores - por exemplo, uma lista de valores separados por vírgulas, que é meio que compatível com o RFC, mas não é realmente compatível com a maioria dos navegadores principais. Observe que a RFC fala sobre como permitir mais de um domínio sem usar '*' também.Por exemplo, você pode obter esse erro no Chrome usando um cabeçalho como este:
Access-Control-Allow-Origin: http://test.mysite.com, http://test2.mysite.com
Isto estava em
Chrome Version 64.0.3282.186 (Official Build) (64-bit)
Observe que se você está considerando isso por causa de um CDN e usa a Akamai, pode querer observar que a Akamai não armazenará em cache no servidor se você usar
Vary:Origin
, da maneira que muitos sugerem para resolver esse problema.Você provavelmente terá que alterar a forma como sua chave de cache é construída, usando um comportamento de resposta "Cache ID Modification". Mais detalhes sobre este problema nesta questão StackOverflow relacionada
fonte
Access-Control-Allow-Origin: http://test.mysite.com http://test2.mysite.com
. Essa seria a maneira correta, mas os navegadores não seguem o padrão aqui ( fonte ).Tão estúpido e simples:
Este problema ocorreu para mim ao ter duas vezes
Header always set Access-Control-Allow-Origin *
dentro do meu arquivo de configuração do Apache. Uma vez dentro dasVirtualHost
tags e uma vez dentro daLimit
tag:Remover uma entrada resolveu o problema.
Acho que na postagem original teria sido duas vezes:
fonte
só tive esse problema com um servidor nodejs.
aqui está como eu consertei.
Eu executo meu servidor de nó através de um
nginx proxy
e eu defini nginx enode
para ambosallow cross domain requests
e ele não gostou, então eu o removi do nginx e o deixei no nó e tudo estava bem.fonte
rack-cors
gem lidar com as coisas do CORS. Bam, consertado.Eu enfrentei o mesmo problema e isso é o que fiz para resolvê-lo:
No serviço WebApi, dentro de Global.asax, escrevi o seguinte código:
Aqui, este código permite apenas a solicitação de pré-voo e de token para adicionar "Access-Control-Allow-Origin" na resposta, caso contrário, não o estou adicionando.
Aqui está meu blog sobre a implementação: https://ibhowmick.wordpress.com/2018/09/21/cross-domain-token-based-authentication-with-web-api2-and-jquery-angular-5-angular- 6 /
fonte
para aqueles que estão usando IIS com php, no IIS, atualize o arquivo web.config do lado do servidor no diretório raiz (wwwroot) e adicione este
depois disso reinicie o servidor IIS, digite IISReset em RUN e digite
fonte
Aqui está outra instância semelhante aos exemplos acima, em que você pode ter apenas um arquivo de configuração para definir onde está o CORS: Havia dois arquivos web.config no servidor IIS no caminho em diretórios diferentes e um deles estava oculto no diretório virtual. Para resolver isso, apaguei o arquivo de configuração do nível raiz, pois o caminho estava usando o arquivo de configuração no diretório virtual. Tem que escolher um ou outro.
fonte
O cabeçalho 'Access-Control-Allow-Origin' contém vários valores
Quando recebi esse erro, passei muitas horas procurando a solução para isso, mas nada funciona, finalmente encontrei a solução para esse problema que é muito simples. quando o cabeçalho '' Access-Control-Allow-Origin 'for adicionado mais de uma vez à sua resposta, este erro ocorrer, verifique seu apache.conf ou httpd.conf (servidor Apache), o script do lado do servidor e remova o cabeçalho de entrada indesejado desses arquivos .
fonte