json the Configurando Access-Control-Allow-Origin no ASP.Net MVC-método mais simples possível




no access control allow origin header is present on the requested resource dotnet (10)

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: "*")]

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);

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>


    public ActionResult ActionName(string ReqParam1, string ReqParam2, string ReqParam3, string ReqParam4)
    {
        this.ControllerContext.HttpContext.Response.Headers.Add("Access-Control-Allow-Origin","*");
         /*
                --Your code goes here --
         */
        return Json(new { ReturnData= "Data to be returned", Success=true }, JsonRequestBehavior.AllowGet);
    }

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>

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

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

Isso é muito simples, basta adicionar isso no web.config

<system.webServer>
  <httpProtocol>
    <customHeaders>
      <add name="Access-Control-Allow-Origin" value="http://localhost" />
      <add name="Access-Control-Allow-Headers" value="X-AspNet-Version,X-Powered-By,Date,Server,Accept,Accept-Encoding,Accept-Language,Cache-Control,Connection,Content-Length,Content-Type,Host,Origin,Pragma,Referer,User-Agent" />
      <add name="Access-Control-Allow-Methods" value="GET, PUT, POST, DELETE, OPTIONS" />
      <add name="Access-Control-Max-Age" value="1000" />
    </customHeaders>
  </httpProtocol>
</system.webServer>

Em Origin colocar todos os domínios que têm acesso ao seu servidor web, nos cabeçalhos colocar todos os cabeçalhos possíveis que qualquer solicitação ajax http pode usar, nos métodos colocar todos os métodos que você permitir em seu servidor

Saudações :)


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


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);
    }
}

Às vezes o verbo OPTIONS também causa problemas

Simplesmente: Atualize seu web.config com o seguinte

<system.webServer>
    <httpProtocol>
        <customHeaders>
          <add name="Access-Control-Allow-Origin" value="*" />
          <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />
        </customHeaders>
    </httpProtocol>
</system.webServer>

E atualize os cabeçalhos do webservice / controller com httpGet e httpOptions

// GET api/Master/Sync/?version=12121
        [HttpGet][HttpOptions]
        public dynamic Sync(string version) 
        {




asp.net-ajax