Comment activer CORS dans ASP.NET Core

190

J'essaie d'activer le partage de ressources d'origine croisée sur mon API Web ASP.NET Core, mais je suis bloqué.

L' EnableCorsattribut accepte le policyNametype stringcomme paramètre:

// Summary:
//     Creates a new instance of the Microsoft.AspNetCore.Cors.Core.EnableCorsAttribute.
//
// Parameters:
//   policyName:
//     The name of the policy to be applied.
public EnableCorsAttribute(string policyName);

Qu'est-ce que cela policyNamesignifie et comment puis-je configurer CORS sur une API Web ASP.NET Core?

Oluwafemi
la source

Réponses:

328

Vous devez configurer une stratégie CORS au démarrage de l'application dans la ConfigureServicesméthode:

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
    {
        builder.AllowAnyOrigin()
               .AllowAnyMethod()
               .AllowAnyHeader();
    }));

    // ...
}

Le CorsPolicyBuilderin buildervous permet de configurer la politique selon vos besoins. Vous pouvez maintenant utiliser ce nom pour appliquer la stratégie aux contrôleurs et aux actions:

[EnableCors("MyPolicy")]

Ou appliquez-le à chaque demande:

public void Configure(IApplicationBuilder app)
{
    app.UseCors("MyPolicy");

    // ...

    // This should always be called last to ensure that
    // middleware is registered in the correct order.
    app.UseMvc();
}
Henk Mollema
la source
12
J'ai trouvé que app.UseCors ("MyPolicy") ne fonctionnait pas pour mes points de terminaison d'API. J'avais besoin de explicitement [EnableCors ("MyPolicy")] sur les points de terminaison du contrôleur en question.
robbpriestley
9
Extrait de la documentation officielle : "Pour activer CORS pour l'ensemble de votre application, ajoutez le middleware CORS à votre pipeline de requêtes à l'aide de la UseCorsméthode d'extension. Notez que le middleware CORS doit précéder tous les points de terminaison définis dans votre application pour lesquels vous souhaitez prendre en charge les requêtes cross-origin (ex . avant tout appel à UseMvc). "
Alex Klaus
2
J'ai ajouté app.UseCors () après app.AddMvc () et cela n'a pas fonctionné. Parce que l'ordre d'utilisation des méthodes affecte le fonctionnement du middleware!
Obay Abd-Algader
1
Y a-t-il des risques à autoriser une origine?
Percy
Cette réponse n'a pas fonctionné pour moi, en raison du package nuget Microsoft.AspNetCore.Cors manquant.
Reven
108

S'applique à .NET Core 1 et .Net Core 2 (plus bas)

Si vous utilisez .Net-Core 1.1

Malheureusement, les documents sont très déroutants dans ce cas précis. Je vais donc faire simple:

  • Ajouter Microsoft.AspNetCore.Corsun package nuget à votre projet
  • Dans la ConfigureServicesméthode, ajoutezservices.AddCors();
  • Dans Configuremethod, avant d'appeler app.UseMvc()et app.UseStaticFiles(), ajoutez:

    app.UseCors(builder => builder
        .AllowAnyOrigin()
        .AllowAnyMethod()
        .AllowAnyHeader()
        .AllowCredentials());

C'est tout. Chaque client a accès à votre site Web / API ASP.NET Core.


Si vous utilisez .Net-Core 2.0

  • Ajouter Microsoft.AspNetCore.Corsun package nuget à votre projet
  • dans la ConfigureServicesméthode, avant d' appeler services.AddMvc(), ajoutez:

     services.AddCors(options =>
        {
            options.AddPolicy("AllowAll",
                builder =>
                {
                    builder
                    .AllowAnyOrigin() 
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials();
                });
        });
  • (Important) Dans la Configureméthode, avant d' appeler app.UseMvc(), ajoutez app.UseCors("AllowAll");

    AllowAllest le nom de la stratégie que nous devons mentionner dans app.UserCors. Cela peut être n'importe quel nom.

Vahid Amiri
la source
2
vrai, je pensais pouvoir activer un seul d'entre eux!
eugeneK
7
Merci. J'avais mes AddCors après UseMvc et cela ne fonctionnait pas correctement. La vôtre est la seule réponse qui mentionne cela.
JesseNewman19
1
Cela ne fonctionne pas, je ne pense pas. Lorsque vous fournissez des informations d'identification, vous ne pouvez autoriser aucune origine. J'essaie toujours de faire fonctionner ça.
Jason Goemaat
7
C'est la pièce clé: .UseCors()avant.UseMvc()
Neps
3
J'ai perdu du temps à ne pas connaître UseCors avant UserMvc ... merci pour l'aide!
Thomas
37

Sur la base de la réponse de Henk, j'ai pu trouver le domaine spécifique, la méthode que je veux autoriser et aussi l'en-tête pour lequel je veux activer CORS:

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
         options.AddPolicy("AllowSpecific", p => p.WithOrigins("http://localhost:1233")
                                                   .WithMethods("GET")
                                                   .WithHeaders("name")));
    services.AddMvc();
}

usage:

[EnableCors("AllowSpecific")]
Oluwafemi
la source
Cela ne répond pas à la question. Pour critiquer ou demander des éclaircissements à un auteur, laissez un commentaire sous sa publication.
zrvan
14
To critique or request clarification from an authorJe ne pense pas que ce soit le cas ici et la réponse de Henk a déjà été marquée. Ma réponse était un complément si vous souhaitez autoriser des domaines spécifiques.
Oluwafemi
Quelque chose manque dans votre code, «IServiceCollection» ne contient pas de définition pour «ConfigureCors». Veuillez le vérifier et essayer de donner une réponse complète.
Sami-L
@ Sami-L Veuillez vérifier ma réponse mise à jour. J'ai découvert que ConfigureCorsc'était changé en AddCors.
Oluwafemi
9

Plus précisément dans dotnet core 2.2 avec SignalR, vous devez changer

.WithOrigins("http://localhost:3000") ou

.SetIsOriginAllowed(isOriginAllowed: _ => true) //for all origins

à la place .AllowAnyOrigin()avec.AllowCredentials()

https://trailheadtechnology.com/breaking-change-in-aspnetcore-2-2-for-signalr-and-cors/

https://github.com/aspnet/AspNetCore/issues/4483

PJ3
la source
Utiliser SignalR dans une application console .NET Core et c'est la seule solution qui fonctionne pour mon scénario.
asdf
7

Si vous hébergez sur IIS, l'une des raisons possibles est que vous obtenez cela, car IIS bloque le OPTIONSverbe. J'ai passé près d'une heure à cause de ça:

Une indication révélatrice est que vous obtenez une 404erreur lors de la OPTIONSdemande.

Pour résoudre ce problème, vous devez indiquer explicitement à IIS de ne pas bloquer la OPTIONSdemande.

Accédez au filtrage des demandes:

Filtrage des demandes IIS

Assurez-vous que OPTIONS est autorisé:

Assurez-vous que OPTIONS est vrai

Ou créez simplement un web.configavec le paramètre suivant:

<system.webServer>
    <security>
        <requestFiltering>
            <verbs>
                <remove verb="OPTIONS" />
                <add verb="OPTIONS" allowed="true" />
            </verbs>
        </requestFiltering>
    </security>
</system.webServer>
Rosdi Kasim
la source
7

Vous devez configurer dans la classe Startup.cs

services.AddCors(options =>
        {
            options.AddPolicy("CorsPolicy",
                builder => builder.AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader()
                .AllowCredentials());
        });
Sunil Dhappadhule
la source
5

»

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddCors(options =>
        {
            options.AddPolicy("AllowAnyOrigin",
                builder => builder
                .AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader());
        });

        services.Configure<MvcOptions>(options => {
            options.Filters.Add(new CorsAuthorizationFilterFactory("AllowAnyOrigin"));
        });            
    }

»

Nathan Alard
la source
1
Merveilleux moyen de contourner la sécurité du navigateur déjà déployée. Ne le fais pas!
JCKödel
2
Je ne pense pas que cela devrait être voté à la baisse. C'est une manière «alternative». Vous pouvez soit utiliser la méthode "UseCors ()", soit ajouter un filtre MVC global comme ce que Nathan a fait ici.
Josh Mouch
cela fonctionne pour moi sur .net core 2.2 plus l'ajout de app.UseCors ("AllowAnyOrigin"); dans la méthode "Configure"
Harry Sarshogh
Il est important «d'ajouter le package nuget Microsoft.AspNetCore.Cors à votre projet». Merci de le mentionner!
Mason Zhang
5

Cela fonctionne avec .Net Core 3.1 comme suit

1.Assurez-vous de placer le code UseCors entre app.UseRouting (); et app.UseAuthentication ();

        app.UseHttpsRedirection();

        app.UseRouting();
        app.UseCors("CorsApi");

        app.UseAuthentication();
        app.UseAuthorization();

        app.UseEndpoints(endpoints => {
            endpoints.MapControllers();
        });

2.Puis placez ce code dans la méthode ConfigureServices

services.AddCors(options =>
        {
            options.AddPolicy("CorsApi",
                builder => builder.WithOrigins("http://localhost:4200", "http://mywebsite.com")
            .AllowAnyHeader()
            .AllowAnyMethod());
        });

3.Et au-dessus du contrôleur de base, j'ai placé ceci

[EnableCors("CorsApi")]
[Route("api/[controller]")]
[ApiController]
public class BaseController : ControllerBase

Maintenant, tous mes contrôleurs hériteront du BaseController et auront CORS activé

tfa
la source
Les choses ne fonctionnaient pas pour moi jusqu'à ce que jeplace the UseCors code between app.UseRouting(); and app.UseAuthentication();
0014
1

Étape 1: Nous avons besoin du package Microsoft.AspNetCore.Cors dans notre projet. Pour l'installation, accédez à Outils -> Gestionnaire de packages NuGet -> Gérer les packages NuGet pour la solution. Recherchez Microsoft.AspNetCore.Cors et installez le package.

Étape 2: Nous devons injecter CORS dans le conteneur afin qu'il puisse être utilisé par l'application. Dans la classe Startup.cs, passons à la méthode ConfigureServices et enregistrons CORS.

entrez la description de l'image ici

Donc, dans notre application serveur, allons dans Controllers -> HomeController.cs et ajoutez le décorateur EnableCors à la méthode Index (Ou votre contrôleur et action spécifiques):

entrez la description de l'image ici

Pour plus de détails, cliquez ici

shebin c babu
la source
0

Toutes les solutions de contournement mentionnées ci-dessus peuvent fonctionner ou peuvent ne pas fonctionner, dans la plupart des cas, cela ne fonctionnera pas. J'ai donné la solution ici

Actuellement, je travaille sur l'API angulaire et Web (.net Core) et j'ai rencontré un problème CORS expliqué ci-dessous

La solution fournie ci-dessus fonctionnera toujours. Avec la requête 'OPTIONS', il est vraiment nécessaire d'activer 'Authentification anonyme'. Avec la solution mentionnée ici, vous n'avez pas à suivre toutes les étapes mentionnées ci-dessus, comme les paramètres IIS.

Quoi qu'il en soit, quelqu'un a marqué mon message ci-dessus comme étant en double avec ce message, mais je peux voir que ce message est uniquement destiné à activer CORS dans ASP.net Core, mais mon message est lié à l'activation et à la mise en œuvre de CORS dans ASP.net Core et Angular.

Shivang Kaul
la source