J’ai une méthode d’action simple, qui renvoie du json. Il fonctionne sur ajax.example.com. J’ai besoin d’y accéder depuis un autre site someothersite.com.
Si j’essaie de l’appeler, j’obtiens le résultat attendu:
Origin http://someothersite.com is not allowed by Access-Control-Allow-Origin.
Je connais deux façons de contourner ce problème : JSONP et créer un HttpHandler personnalisé pour définir l’en-tête.
N’y a-t-il pas un moyen plus simple?
N’est-il pas possible pour une action simple de définir une liste d’origines autorisées – ou simple, autoriser tout le monde? Peut-être un filtre d’action?
Optimal serait …:
return json(mydata, JsonBehaviour.IDontCareWhoAccessesMe);
public class AllowCrossSiteJsonAtsortingbute : ActionFilterAtsortingbute { public override void OnActionExecuting(ActionExecutingContext filterContext) { filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*"); base.OnActionExecuting(filterContext); } }
[AllowCrossSiteJson] public ActionResult YourMethod() { return Json("Works better?"); }
using System; using System.Web.Http.Filters; public class AllowCrossSiteJsonAtsortingbute : ActionFilterAtsortingbute { public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { if (actionExecutedContext.Response != null) actionExecutedContext.Response.Headers.Add("Access-Control-Allow-Origin", "*"); base.OnActionExecuted(actionExecutedContext); } }
[AllowCrossSiteJson] public class ValuesController : ApiController {
[AllowCrossSiteJson] public IEnumerable Get() { ... }
IE <= 9 ne supporte pas CORS. J'ai écrit un javascript qui acheminera automatiquement ces requêtes via un proxy. Tout est transparent à 100% (il suffit d'inclure mon proxy et le script).
Téléchargez-le en utilisant nuget corsproxy
et suivez les instructions fournies.
Blog post | Code source
Si vous utilisez IIS 7+, vous pouvez placer un fichier web.config dans la racine du dossier avec ceci dans la section system.webServer:
Voir: http://msdn.microsoft.com/en-us/library/ms178685.aspx Et: http://enable-cors.org/#how-iis7
J’ai rencontré un problème lorsque le navigateur a refusé de fournir le contenu qu’il avait récupéré lorsque la demande passait dans les cookies (par exemple, le fichier xhr avait withCredentials=true
) et le site avait défini Access-Control-Allow-Origin
sur *
. (L’erreur dans Chrome était la suivante: “Impossible d’utiliser un caractère générique dans Access-Control-Allow-Origin lorsque l’indicateur d’identification est true.”)
En me basant sur la réponse de @jgauffin, j’ai créé ceci, qui est essentiellement une façon de contourner ce contrôle de sécurité de navigateur particulier, de manière à éviter les vides.
public class AllowCrossSiteJsonAtsortingbute : ActionFilterAtsortingbute { 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 = !ssortingng.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); } }
C’est vraiment simple, ajoutez simplement ceci dans web.config
Dans Origin, tous les domaines ayant access à votre serveur Web, dans des en-têtes, placent tous les en-têtes possibles que toute requête http ajax peut utiliser, dans les méthodes, placez toutes les méthodes que vous autorisez sur votre serveur.
Cordialement 🙂
Parfois, le verbe OPTIONS provoque aussi des problèmes
Simplement: mettez à jour votre web.config avec les éléments suivants
Et mettre à jour les en-têtes webservice / controller avec httpGet et httpOptions
// GET api/Master/Sync/?version=12121 [HttpGet][HttpOptions] public dynamic Sync(ssortingng version) {
WebAPI 2 a maintenant un package pour CORS qui peut être installé à l’aide de: Install-Package Microsoft.AspNet.WebApi.Cors -pre -project WebServic
Une fois que ceci est installé, suivez ceci pour le code: http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api
Ajoutez cette ligne à votre méthode, si vous utilisez une API.
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
Ce tutoriel est très utile. Pour donner un résumé rapide:
Utilisez le package CORS disponible sur Nuget: Install-Package Microsoft.AspNet.WebApi.Cors
Dans votre fichier WebApiConfig.cs
, ajoutez config.EnableCors()
à la méthode Register()
.
Ajoutez un atsortingbut aux contrôleurs dont vous avez besoin pour gérer les cors:
[EnableCors(origins: "
public ActionResult ActionName(ssortingng ReqParam1, ssortingng ReqParam2, ssortingng ReqParam3, ssortingng 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); }
Dans Web.config entrez les informations suivantes