217 votes

Paramètre Access-Control-Allow-Origin dans ASP.Net MVC - méthode la plus simple possible

J'ai une simple actionmethod, qui renvoie certains json. Il fonctionne sur ajax.example.com. J'ai besoin d'accéder à ce à 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 ce problème: JSONP et la création d'un custom HttpHandler à définir l'en-tête.

N'est-il pas plus simple?

Il n'est pas possible pour une action simple pour définir une liste de permis origines - ou de simples permettent à tout le monde? Peut-être une action de filtre?

Optimale serait...:

return json(mydata, JsonBehaviour.IDontCareWhoAccessesMe);

403voto

jgauffin Points 51913
<h1>Pour la plaine ASP.NET MVC contrôleurs<h2>Créer un nouvel attribut</h2><pre><code></code></pre><h2>Tag de votre action :</h2><pre><code></code></pre><h1>Pour ASP.NET Web API</h1><pre><code></code></pre><h2>Contrôleur de balise un API complet :</h2><pre><code></code></pre><h2>Ou des appels d’API :</h2><pre><code></code></pre></h1>

125voto

LaundroMatt Points 778

Si vous utilisez IIS 7 +, vous pouvez placer un fichier web.config dans la racine du dossier avec cela dans la section system.webServer :

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

26voto

Ken Smith Points 9165

J'ai couru dans un problème où le navigateur refuse de servir du contenu qu'il avait récupéré lors de la demande transmise dans les cookies (par exemple, le xhr avait ses withCredentials=true), et le site a Access-Control-Allow-Origin ensemble de *. (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.")

Bâtiment sur la réponse de @jgauffin, j'ai créé ce, qui est essentiellement un moyen de contourner le navigateur de vérification de sécurité, de sorte 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);
    }
}

9voto

Bishoy Hanna Points 901

Verbe OPTIONS provoque parfois aussi bien des problèmes

Simplement : Mettre à jour votre fichier web.config par ce qui suit

Et mettre à jour les en-têtes de webservice/contrôleur avec httpGet et httpOptions

9voto

Tarun Points 339

WebAPI 2 a maintenant un paquet pour CORS qui peut être installé en utilisant : -installer le paquet Microsoft.AspNet.WebApi.Cors - pre-projet WebServic

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X