web-dev-qa-db-fra.com

La stratégie CORS ne veut pas fonctionner avec SignalR et le noyau ASP.NET

J'ai un problème avec mon API principale ASP.NET et mon client Angular. Je veux implémenter SignalR pour avoir une connexion entre l'API et Angular. La politique de cors est déjà activée sur notre client et le API car nous pouvons déjà récupérer les données de l'API avec notre client. Mais le problème est maintenant quand j'essaye d'utiliser SignalR je reçois une erreur avec CORS POLICY:

L'accès à XMLHttpRequest à ' http: // localhost: 50501/CoordinatorHub/negiate ' from Origin ' http: // localhost: 42 ' a été bloqué par la stratégie CORS: réponse à la demande de contrôle en amont ne passe pas la vérification du contrôle d'accès: aucun en-tête "Access-Control-Allow-Origin" n'est présent sur la ressource demandée.

Mais il y a déjà une politique cors à l'intérieur de Startup.cs sur notre API et c'est comme ça:

Dans la méthode ConfigureServices:

services.AddCors(options =>
{
    options.AddPolicy("AllowSpecificOrigin",
        builder => 
        builder.WithOrigins("http://localhost:4200/")
            .AllowCredentials()
            //.AllowAnyOrigin()
            .AllowAnyMethod()
            .AllowAnyHeader()
            .SetIsOriginAllowedToAllowWildcardSubdomains());
});

Et à l'intérieur de la méthode Configure:

app.UseCors("AllowSpecificOrigin");

Dans notre client, nous voulons simplement essayer de faire une connexion entre l'API et le client et c'est comme ça:

this.hubConnection.start({withCredentials: false}).then(() => 
     this.hubConnection.invoke('send', 'Hello'));
11
thelittlewozniak

Remarque cela peut être appliqué à .net core 3.1

Comme il est indiqué sur les documents Microsoft, il semble que cela ne fonctionne pas docs

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    // Preceding code ommitted.
    app.UseRouting();

    app.UseCors();

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

    // Following code ommited.
}

Avertissement

Avec le routage des points d'extrémité, le middleware CORS doit être configuré pour s'exécuter entre les appels à UseRouting et UseEndpoints. Une configuration incorrecte empêchera le middleware de fonctionner correctement.

Mais si vous déplacez votre UseCors () en premier lieu, votre application fonctionnera comme prévu de sorte que le code de travail sera

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

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
//place your useCors here 
    app.UseCors();
    app.UseRouting();


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

    // Following code ommited.
}
1
BRAHIM Kamel

essayez quelque chose comme ça dans votre classe de configuration de démarrage:

app.Map("/CoordinatorHub/negotiate", map =>
{
    map.UseCors(CorsOptions.AllowAll);
    var hubConfiguration = new HubConfiguration 
    {
        // You can enable JSONP by uncommenting line below.
    // EnableDetailedErrors = true,
        // EnableJSONP = true

    };
    map.RunSignalR(hubConfiguration);
});
2
alim91

J'ai résolu mon problème en fonction de cela lien

Ajouter ce code de blocage au service

services.AddCors(options => options.AddPolicy("CorsPolicy",
        builder =>
        {
            builder.AllowAnyHeader()
                   .AllowAnyMethod()
                   .SetIsOriginAllowed((Host) => true)
                   .AllowCredentials();
        }));

et ajoutez ce code de blocage dans la configuration de l'application

app.UseCors("CorsPolicy");
app.UseSignalR(routes =>
        {
            routes.MapHub<General>("/hubs/general");
        });
0
Hamidreza Shokouhi