Paramétrage de L'accès-Control-Allow-Origin dans ASP.Net MVC-méthode la plus simple possible

j'ai une méthode d'action simple, qui renvoie quelques json. Il fonctionne sur ajax.example.com. J'ai besoin d'accéder à ceci à partir d'un autre site someothersite.com.

Si j'essaie de l'appeler, je l'attendais...:

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

je connais deux façons de contourner cela: JSONP et la création d'un HttpHandler personnalisé pour définir l'en-tête.

N'y a-t-il pas de solution plus simple?

n'est - il pas possible pour une simple action de définir soit une liste d'origines permises-soit une simple permission à tout le monde? Peut-être un filtre d'action?

Optimal serait...:

return json(mydata, JsonBehaviour.IDontCareWhoAccessesMe);
181
demandé sur Community 2011-06-09 12:29:18

10 réponses

pour plaine ASP.NET MVC Controllers

créer un nouvel attribut

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

Tag votre action:

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

pour ASP.NET API Web

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

Tag un ensemble d'API contrôleur:

[AllowCrossSiteJson]
public class ValuesController : ApiController
{

ou appels API individuels:

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

pour Internet Explorer <= v9

IE <= 9 ne prend pas en charge la SCRO. J'ai écrit un javascript qui acheminera automatiquement ces requêtes par l'intermédiaire d'un proxy. Tout est 100% transparent (il suffit d'inclure mon proxy et le script).

Téléchargez-le en utilisant nuget corsproxy et suivez les instructions incluses.

Blog post | Source code

340
répondu jgauffin 2016-03-02 20:35:59

si vous utilisez IIS 7+, vous pouvez placer un web.config file dans la racine du dossier avec ceci dans le système.le serveur web de la section:

<httpProtocol>
   <customHeaders>
      <clear />
      <add name="Access-Control-Allow-Origin" value="*" />
   </customHeaders>
</httpProtocol>

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

107
répondu LaundroMatt 2012-07-15 17:08:42

j'ai rencontré un problème lorsque le navigateur a refusé de fournir le contenu qu'il avait récupéré lorsque la demande était passée dans les cookies (par exemple, le xhr avait son withCredentials=true ), et que le site avait Access-Control-Allow-Origin réglé sur * . (L'erreur dans google Chrome a été, "Impossible d'utiliser le caractère générique dans Access-Control-Allow-Origin lorsque les informations d'identification indicateur est vrai.")

en me basant sur la réponse de @jgauffin, j'ai créé ceci, qui est essentiellement une façon de travailler autour de la sécurité de ce navigateur particulier vérifier, donc 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);
    }
}
19
répondu Ken Smith 2013-09-07 08:30:26

C'est vraiment simple , il suffit d'ajouter ceci dans le 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>

dans Origin mettez tous les domaines qui ont accès à votre serveur web, dans les en-têtes mettez tous les en-têtes possibles que n'importe quelle requête http ajax peut utiliser, dans les méthodes mettez toutes les méthodes que vous autorisez sur votre serveur

concerne:)

13
répondu Zvonimir Tokic 2015-12-11 09:54:21

parfois le verbe OPTIONS cause aussi des problèmes

tout simplement: Mise à jour de votre site web.config avec le suivant

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

et mettre à jour les en-têtes webservice/controller avec httpGet et httpOptions

// GET api/Master/Sync/?version=12121
        [HttpGet][HttpOptions]
        public dynamic Sync(string version) 
        {
9
répondu Bishoy Hanna 2017-01-20 11:15:00

WebAPI 2 a maintenant un paquet pour CORS qui peut être installé en utilisant : Install-Package Microsoft.AspNet.WebApi.La scro -pré -projet WebServic

une fois installé, suivez ce pour le code: http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

7
répondu Tarun 2014-04-12 13:33:17

Ajoutez cette ligne à votre méthode, si vous utilisez une API.

HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*"); 
3
répondu Gopichandar 2014-03-14 11:10:25

ce tutoriel est très utile. Pour donner un résumé rapide:

  1. utilisez le paquet CORS disponible sur Nuget: Install-Package Microsoft.AspNet.WebApi.Cors

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

  3. Ajouter un attribut aux contrôleurs dont vous avez besoin pour gérer cors:

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

3
répondu GrandMasterFlush 2015-12-11 10:47:02
    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);
    }
1
répondu Pranav Labhe 2015-05-04 11:46:24

Dans Web.config entrer

<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>
0
répondu Elvis 2018-03-27 09:17:54