Définir Access-Control-Allow-Origin dans ASP.Net MVC – méthode la plus simple possible

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

    Pour les contrôleurs ASP.NET MVC simples

    Créer un nouvel atsortingbut

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

    Marquez votre action:

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

    Pour API Web ASP.NET

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

    Marquer un contrôleur API complet:

     [AllowCrossSiteJson] public class ValuesController : ApiController { 

    Ou appels API individuels:

     [AllowCrossSiteJson] public IEnumerable Get() { ... } 

    Pour Internet Explorer <= v9

    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:

    1. Utilisez le package CORS disponible sur Nuget: Install-Package Microsoft.AspNet.WebApi.Cors

    2. Dans votre fichier WebApiConfig.cs , ajoutez config.EnableCors() à la méthode Register() .

    3. Ajoutez un atsortingbut aux contrôleurs dont vous avez besoin pour gérer les cors:

    [EnableCors(origins: "", headers: "*", methods: "*")]

      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