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.
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);
}
}
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:
<httpProtocol>
<customHeaders>
<clear />
<add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>
</httpProtocol>
Ver: http://msdn.microsoft.com/en-us/library/ms178685.aspx Y: http://enable-cors.org/#how-iis7
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
http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api es muy útil. Para dar un resumen rápido:
Utilice el paquete CORS disponible en Nuget:
Install-Package Microsoft.AspNet.WebApi.Cors
En su archivo
WebApiConfig.cs
, agregueconfig.EnableCors()
al métodoRegister()
.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);
}