origin net mvc enable control asp allow json asp.net-mvc-3 asp.net-ajax

json - enable - Configuración de Access-Control-Allow-Origin en ASP.Net MVC: el método más simple posible



enable cors web api.net core 2 (10)

Tengo un método de acción simple, que devuelve algo de json. Se ejecuta en ajax.example.com. Necesito acceder a esto desde otro sitio someothersite.com.

Si trato de llamarlo, obtengo lo esperado ...

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

Conozco dos formas de evitar esto: JSONP y la creación de un HttpHandler personalizado para configurar el encabezado.

¿No hay una manera más simple?

¿No es posible que una simple acción defina una lista de orígenes permitidos o simplemente permita que todos lo hagan? Tal vez un filtro de acción?

Optimal sería ...

return json(mydata, JsonBehaviour.IDontCareWhoAccessesMe);


Para controladores ASP.NET MVC simples

Crear un nuevo atributo

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

Marque su acción:

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

Para ASP.NET Web API

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 un controlador API completo:

[AllowCrossSiteJson] public class ValuesController : ApiController {

O llamadas API individuales:

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

Para Internet Explorer <= v9

IE <= 9 no es compatible con CORS. He escrito un javascript que enrutará automáticamente esas solicitudes a través de un proxy. Es todo 100% transparente (solo tiene que incluir mi proxy y el script).

Descárguelo usando nuget corsproxy y siga las instrucciones incluidas.

Publicación de blog | Código fuente


A veces el verbo OPTIONS también causa problemas

Simplemente: Actualice su web.config con lo siguiente

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

Y actualice los encabezados del servicio web / controlador con httpGet y httpOptions

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


Agregue esta línea a su método, si está usando una API.

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


En Web.config ingrese lo siguiente

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


Esto es realmente simple, simplemente agregue esto en 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>

En Origin, coloca todos los dominios que tienen acceso a tu servidor web, en los encabezados pon todos los encabezados posibles que cualquier solicitud http ajax puede usar, en los métodos coloca todos los métodos que permites en tu servidor

Saludos :)


Me encontré con un problema donde el navegador se negó a mostrar el contenido que había recuperado cuando la solicitud pasó en las cookies (por ejemplo, el xhr tenía su withCredentials=true ) y el sitio tenía Access-Control-Allow-Origin establecido en * . (El error en Chrome fue "No se puede usar el comodín en Access-Control-Allow-Origin cuando el indicador de credenciales es verdadero").

Sobre la base de la respuesta de @jgauffin, creé esto, que es básicamente una forma de trabajar en esa verificación de seguridad del navegador en particular, así que caveat 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); } }




http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api es muy útil. Para dar un resumen rápido:

  1. Utilice el paquete CORS disponible en Nuget: Install-Package Microsoft.AspNet.WebApi.Cors

  2. En su archivo WebApiConfig.cs , agregue config.EnableCors() al método Register() .

  3. Agregue un atributo a los controladores que necesita para manejar cors:

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


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