web-dev-qa-db-fra.com

CORS dans ASP .NET MVC5

J'ai un projet MVC dans lequel j'ai quelques méthodes de contrôleur JSON que je veux exposer entre domaines. Pas tout le site, juste ces deux méthodes.

Je veux fondamentalement à la chose exacte indiquée dans ce post pour cors:

http://enable-cors.org/server_aspnet.html

Cependant, le problème est que j'ai un projet MVC normal et non une API Web, ce qui signifie que je ne peux pas suivre les étapes relatives au registre.

public static void Register(HttpConfiguration config)
{
    // New code
    config.EnableCors();
}

méthode car il n'est pas présent dans mon projet MVC.

Existe-t-il un moyen d'utiliser cette bibliothèque alors qu'il s'agit d'un projet MVC?

Je suis conscient que je peux le configurer via web.config en utilisant:

<httpProtocol>
      <customHeaders>
        <clear />
        <add name="Access-Control-Allow-Origin" value="http://www.domain.com" />
      </customHeaders>
</httpProtocol>

Mais je ne veux pas exposer toutes les méthodes, et je veux spécifier plus d'un domaine (2 domaines) pour avoir accès à mes méthodes ...

44
user4309587

Comme décrit ici: Définition de la méthode la plus simple possible

Vous devriez simplement créer un filtre d'action et y définir les en-têtes. Vous pouvez utiliser ce filtre d'action sur vos méthodes d'action où vous le souhaitez.

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

Si vous souhaitez ajouter plusieurs domaines, vous ne pouvez pas définir l'en-tête plusieurs fois. Dans votre filtre d'action, vous devrez vérifier si le domaine demandeur provient de votre liste de domaines, puis définir l'en-tête.

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var domains = new List<string> {"domain2.com", "domain1.com"};

        if (domains.Contains(filterContext.RequestContext.HttpContext.Request.UrlReferrer.Host))
        {
            filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
        }

        base.OnActionExecuting(filterContext);
    }
62