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

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

Si está utilizando IIS 7+, puede colocar un archivo web.config en la raíz de la carpeta con esto en la sección system.webServer:

       

Ver: http://msdn.microsoft.com/en-us/library/ms178685.aspx Y: http://enable-cors.org/#how-iis7

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

Esto es realmente simple, simplemente agregue esto en web.config

           

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 🙂

A veces el verbo OPTIONS también causa problemas

Simplemente: Actualice su web.config con lo siguiente

         

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

WebAPI 2 ahora tiene un paquete para CORS que se puede instalar usando: Install-Package Microsoft.AspNet.WebApi.Cors -pre -project WebServic

Una vez que esté instalado, siga este para el código: http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

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

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

Este tutorial 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: "", 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); } 

En Web.config ingrese lo siguiente