json - mvc5 - no access control allow origin header is present on the requested resource dotnet




Configurando Access-Control-Allow-Origin no ASP.Net MVC-método mais simples possível (8)

Eu tenho um método de ação simples, que retorna algum json. Ele é executado em ajax.example.com. Eu preciso acessar isso de outro site someothersite.com.

Se eu tentar chamá-lo, recebo o esperado ...:

Origin http://someothersite.com is not allowed by Access-Control-Allow-Origin.

Eu sei de duas maneiras de contornar isso: JSONP e criar um HttpHandler personalizado para definir o cabeçalho.

Não há um caminho mais simples?

Não é possível para uma ação simples definir uma lista de origens permitidas ou simplesmente permitir a todos? Talvez um filtro de ação?

Ótimo seria ...:

return json(mydata, JsonBehaviour.IDontCareWhoAccessesMe);

Existem diferentes maneiras pelas quais podemos passar os cabeçalhos Access-Control-Expose-Headers.

  • Como o jgauffin explicou, podemos criar um novo atributo.
  • Como LaundroMatt explicou, podemos adicionar o arquivo web.config.
  • Outra maneira é adicionar código conforme abaixo no arquivo webApiconfig.cs.

    config.EnableCors (new EnableCorsAttribute (" ", headers: " ", métodos: "*", exposedHeaders: "TestHeaderToExpose") {SupportsCredentials = true});

Ou podemos adicionar o código abaixo no arquivo Global.Asax.

protected void Application_BeginRequest()
        {
            if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
            {
                //These headers are handling the "pre-flight" OPTIONS call sent by the browser
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "*");
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Credentials", "true");
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "http://localhost:4200");
                HttpContext.Current.Response.AddHeader("Access-Control-Expose-Headers", "TestHeaderToExpose");
                HttpContext.Current.Response.End();
            }
        }

Eu escrevi para as opções. Por favor, modifique o mesmo conforme sua necessidade.

Codificação Feliz !!


Para controladores ASP.NET MVC simples

Crie um novo atributo

public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
        base.OnActionExecuting(filterContext);
    }
}

Marque sua ação:

[AllowCrossSiteJson]
public ActionResult YourMethod()
{
    return Json("Works better?");
}

Para a API da Web do ASP.NET

using System;
using System.Web.Http.Filters;

public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        if (actionExecutedContext.Response != null)
            actionExecutedContext.Response.Headers.Add("Access-Control-Allow-Origin", "*");

        base.OnActionExecuted(actionExecutedContext);
    }
}

Etiquetar um controlador de API inteiro:

[AllowCrossSiteJson]
public class ValuesController : ApiController
{

Ou chamadas de API individuais:

[AllowCrossSiteJson]
public IEnumerable<PartViewModel> Get()
{
    ...
}

Para o Internet Explorer <= v9

IE <= 9 não suporta CORS. Escrevi um javascript que roteará automaticamente essas solicitações por meio de um proxy. É tudo 100% transparente (você só precisa incluir meu proxy e o script).

Faça o download usando o nuget corsproxy e siga as instruções incluídas.

Postagem no blog | Código fonte


Adicione esta linha ao seu método, se você estiver usando uma API.

HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*"); 

Eu me deparei com um problema em que o navegador se recusava a exibir o conteúdo que havia recuperado quando a solicitação passava em cookies (por exemplo, o xhr tinha seu withCredentials=true ) e o site tinha Access-Control-Allow-Origin definido como * . (O erro no Chrome era "Não é possível usar curinga no Access-Control-Allow-Origin quando o sinalizador de credenciais é verdadeiro".)

Com base na resposta do @jgauffin, criei isso, que é basicamente uma maneira de contornar essa verificação de segurança específica do navegador, portanto, impeça o emptor.

public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // We'd normally just use "*" for the allow-origin header, 
        // but Chrome (and perhaps others) won't allow you to use authentication if
        // the header is set to "*".
        // TODO: Check elsewhere to see if the origin is actually on the list of trusted domains.
        var ctx = filterContext.RequestContext.HttpContext;
        var origin = ctx.Request.Headers["Origin"];
        var allowOrigin = !string.IsNullOrWhiteSpace(origin) ? origin : "*";
        ctx.Response.AddHeader("Access-Control-Allow-Origin", allowOrigin);
        ctx.Response.AddHeader("Access-Control-Allow-Headers", "*");
        ctx.Response.AddHeader("Access-Control-Allow-Credentials", "true");
        base.OnActionExecuting(filterContext);
    }
}

No Web.config, digite o seguinte

<system.webServer>
<httpProtocol>
  <customHeaders>
    <clear />     
    <add name="Access-Control-Allow-Credentials" value="true" />
    <add name="Access-Control-Allow-Origin" value="http://localhost:123456(etc)" />
  </customHeaders>
</httpProtocol>


Se você usa o IIS, sugiro tentar o módulo IIS CORS .
É fácil de configurar e funciona para todos os tipos de controladores.

Aqui está um exemplo de configuração:

    <system.webServer>
        <cors enabled="true" failUnlistedOrigins="true">
            <add origin="*" />
            <add origin="https://*.microsoft.com"
                 allowCredentials="true"
                 maxAge="120"> 
                <allowHeaders allowAllRequestedHeaders="true">
                    <add header="header1" />
                    <add header="header2" />
                </allowHeaders>
                <allowMethods>
                     <add method="DELETE" />
                </allowMethods>
                <exposeHeaders>
                    <add header="header1" />
                    <add header="header2" />
                </exposeHeaders>
            </add>
            <add origin="http://*" allowed="false" />
        </cors>
    </system.webServer>

http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api é muito útil. Para dar um resumo rápido:

  1. Use o pacote CORS disponível no Nuget: Install-Package Microsoft.AspNet.WebApi.Cors

  2. No seu arquivo WebApiConfig.cs , adicione config.EnableCors() ao método Register() .

  3. Adicione um atributo aos controladores que você precisa para lidar com cors:

[EnableCors(origins: "<origin address in here>", headers: "*", methods: "*")]





asp.net-ajax