none
Mensagem "No 'Access-Control-Allow-Origin'" para site em Angular + AspNet Web API. RRS feed

  • Pergunta

  • Boa tarde a todos,

    Estou desenvolvendo um sistema web onde o front é desenvolvido em Angular e o server é desenvolvido em AspNet Web API.

    No desenvolvimento do login, utilizo o OAuth 2.0. Faço com duas requisições, sendo uma para recuperar o Token e a segunda para validar se o usuário existe e a partir daí acesso o sistema.

    Na primeira requisição existe a comunicação do site com o server normal, retorna o token normalmente. Na segunda requisição é apresentada a mensagem abaixo:

    XMLHttpRequest cannot load http://localhost:meuserver. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:meusite' is therefore not allowed access. The response had HTTP status code 404.

    Minha classe WebApiConfig.cs está assim:

    var cors = new EnableCorsAttribute("http://localhost:meusite", "Authorization, X-Requested-With, Content-Type, Accept, Origin, Cache-Control", "GET, POST, PUT, DELETE, OPTIONS");
     config.EnableCors(cors);

    Minha classe Controller assim:

    [Authorize]
        [EnableCors(origins: "http://localhost:meusite", headers: "*", methods: "*")]
        public class UsuarioController : ApiController
        {

    Minhas requisições front estão assim:

    $http.post(API_URL.token, data, { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } })
                    .then(function(result) {

                        console.log(result);

                        $http.post(API_URL.login, data, { headers: { 'Content-Type': 'application/raw' } })
                             .then(function(result) 
                                 console.log(result);

    Já testei vários exemplos encontrados na internet, porém não funcionou com nenhum deles. Alguém poderia me dar uma ajuda com esse problema?

    Obrigado.

    sábado, 12 de dezembro de 2015 18:44

Respostas

  • Bom dia,

    Por falta de retorno do usuário, esta thread será encerrada.

    Caso seja necessário, por gentileza, abra uma thread nova.

    Atenciosamente

    Marcos Roberto de Souza Junior

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    • Marcado como Resposta Marcos SJ segunda-feira, 28 de dezembro de 2015 09:50
    segunda-feira, 28 de dezembro de 2015 09:50

Todas as Respostas

  • Bom dia Rafael_Oliveira_CC,

    Você já tentou fazer sua pergunta lá mesmo no tutorial?

    Vários desenvolvedores o fizeram pelos comemntários da página. Acredito que assim fica mais fácil para encontrar alguém que possa te auxiliar com isso.

    Atenciosamente


    Marcos Roberto de Souza Junior

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    terça-feira, 15 de dezembro de 2015 11:27
  • Bom dia Rafael,

    Já criei este tipo de aplicação, e habilitei o CORS no .config

    dentro do <system.webServer>

    <httpProtocol>
          <customHeaders>
            <add name="Access-Control-Allow-Origin" value="*"/>
            <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
          </customHeaders>
     </httpProtocol>

    Veja se resolve seu problema e nos envie os resultados.

    Atenciosamente,

    terça-feira, 15 de dezembro de 2015 12:17
  • Bom dia Rafael,

    Já criei este tipo de aplicação, e habilitei o CORS no .config

    dentro do <system.webServer>

    <httpProtocol>
          <customHeaders>
            <add name="Access-Control-Allow-Origin" value="*"/>
            <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
          </customHeaders>
     </httpProtocol>

    Veja se resolve seu problema e nos envie os resultados.

    Atenciosamente,

    Wiliam fazendo dessa forma que você citou, você não coloca esse trecho de código abaixo na classe WebApiConfigs.cs?

    config.EnableCors(cors);

    E caso você queira habilitar apenas para um site adiciona no value da primeira chave o caminho do site em questão?


    terça-feira, 15 de dezembro de 2015 12:50
  • Bom dia,

    Não precisa fazer nada no WebApiConfig.cs se você habilitar no .config (há varia formas de fazer, utilize uma).

    Também não precisa do EnableCors no Controller (Caso utilize este método para habiliar o CORS).

    Basta você colocar nos metodos publicos da API, um accept verbs Exemplo:

    [AcceptVerbs("GET")]
    public string GetUser() 
    {
        return "Wiliam Buzatto";
               
    }

    E quanto a pergunta sobre liberar um único domínio: Sim, basta colocar o URL dentro do Value:

    <add name="Access-Control-Allow-Origin" value="http://domain1.com"/>

    NOTA: Se tiver um subdominio, ou porta diferente, deve adicionar também:

    <add name="Access-Control-Allow-Origin" value="http://domain1.com, http://sub.domain1.com"/>

    Atenciosamente,


    • Editado Wiliam Buzatto terça-feira, 15 de dezembro de 2015 14:18 Respondendo a pergunta
    terça-feira, 15 de dezembro de 2015 14:13
  • Bom dia,

    Não precisa fazer nada no WebApiConfig.cs se você habilitar no .config (há varia formas de fazer, utilize uma).

    Também não precisa do EnableCors no Controller (Caso utilize este método para habiliar o CORS).

    Basta você colocar nos metodos publicos da API, um accept verbs Exemplo:

    [AcceptVerbs("GET")]
    public string GetUser() 
    {
        return "Wiliam Buzatto";
               
    }

    E quanto a pergunta sobre liberar um único domínio: Sim, basta colocar o URL dentro do Value:

    <add name="Access-Control-Allow-Origin" value="http://domain1.com"/>

    NOTA: Se tiver um subdominio, ou porta diferente, deve adicionar também:

    <add name="Access-Control-Allow-Origin" value="http://domain1.com, http://sub.domain1.com"/>

    Atenciosamente,


    Entendi, obrigado, vou testar.
    terça-feira, 15 de dezembro de 2015 15:46
  • Rafael_Oliveira_CC,

    Tudo bem?

    Já conseguiu fazer os devidos testes?

    Atenciosamente


    Marcos Roberto de Souza Junior

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    quarta-feira, 16 de dezembro de 2015 19:37
  • Peço desculpa pela demora em responder.

    Não obtive sucesso, segue abaixo como ficou meu código e qual foi o erro apresentado:

    Web.Config:

    <system.webServer>   

    <httpProtocol>

    <customHeaders>       

    <add name="Access-Control-Allow-Origin" value="http://localhost:9000"/>

            <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />

    </customHeaders>   

    </httpProtocol>

    UsuarioController:

    [Authorize]   

    public class UsuarioController : ApiController   

    {

    [Route("api/usuario/validaLogin")]
            [AcceptVerbs("POST")]
            public usuarioRetorno Post([FromBody] usuario entidade)
            {

    O erro que apresenta abaixo indica que estou passando o valor de Access-Control-Allow-Origin repetido, porém não estou, olhei todo o código e em nenhum outro lugar é passado o valor de novo, nem o front.

    XMLHttpRequest cannot load http://localhost:50278/api/usuario/validaLogin. The 'Access-Control-Allow-Origin' header contains multiple values 'http://localhost:9000, http://localhost:9000', but only one is allowed. Origin 'http://localhost:9000' is therefore not allowed access.

    Obrigado.

    domingo, 20 de dezembro de 2015 15:00
  • Bom dia,

    Tente permitindo para todas as origens:

    <add name="Access-Control-Allow-Origin" value="*"/>

    E verifique se há outros códigos de CORS no projeto em conflito com este.

    NOTA: Também é possível habilitar o CORS de outras maneiras, esta é uma delas.

    segunda-feira, 21 de dezembro de 2015 13:44
  • Boa noite,

    Alterei conforme sugerido e veja o erro retornado:

    XMLHttpRequest cannot load http://localhost:50278/api/usuario/validaLogin. The 'Access-Control-Allow-Origin' header contains multiple values 'http://localhost:9000, *', but only one is allowed. Origin 'http://localhost:9000' is therefore not allowed access.

    O mais estranho de tudo isso é que eu vi classe por classe, e não existe nenhuma "http://localhost:9000" no código já que alterei para o * conforme sugerido.

    Também já tentei fazer de outras formas, e o resultado foi sempre o mesmo. Ou que não existia ou que estava duplicado.

    Vou tentar mais um pouco e caso não consiga vou tentar fazer com o padrão de Autenticação de Token JSON We Token.

    Obrigado.

    segunda-feira, 21 de dezembro de 2015 23:16
  • Rafael_Oliveira_CC,

    Conseguiu resolver o problema?


    Marcos Roberto de Souza Junior

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    quinta-feira, 24 de dezembro de 2015 12:24
  • Bom dia,

    Por falta de retorno do usuário, esta thread será encerrada.

    Caso seja necessário, por gentileza, abra uma thread nova.

    Atenciosamente

    Marcos Roberto de Souza Junior

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    • Marcado como Resposta Marcos SJ segunda-feira, 28 de dezembro de 2015 09:50
    segunda-feira, 28 de dezembro de 2015 09:50