Problemi con la politica CORS e .NET Core 3.1


12

Non sono sicuro di cosa mi manchi, ma non riesco a far funzionare la mia politica CORS con il client .NET Core 3.1 e Angular 8.

Startup.cs:

        public void ConfigureServices(IServiceCollection services)
        {
            // ...

            // Add CORS policy
            services.AddCors(options =>
            {
                options.AddPolicy("foo",
                builder =>
                {
                    // Not a permanent solution, but just trying to isolate the problem
                    builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();
                });
            });

            services.AddControllers();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseHttpsRedirection();

            // Use the CORS policy
            app.UseCors("foo");

            app.UseRouting();

            app.UseAuthorization();

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

Messaggio di errore Lato client:

Access to XMLHttpRequest at 'https://localhost:8082/api/auth/' from origin 'http://localhost:4200' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

AGGIORNARE:

Anche se io stavo configurando CORS in modo non corretto (e la risposta accettata sotto fatto infatti aiutare in questo) la radice del problema è correlato. Per un ulteriore contesto, l'app funzionava perfettamente durante l'esecuzione dell'API e dell'app Angular utilizzando l'interfaccia della riga di comando. Ho riscontrato questo problema solo dopo averli distribuiti su un server Web.

Il problema "effettivo" è stato correlato alla connessione SQL, che ho scoperto solo dopo aver aggiunto la registrazione degli errori di file flat all'API e aver eseguito una traccia di SQL Server per scoprire che l'app non era in grado di connettersi affatto a SQL.

Normalmente mi aspetto che questo restituisca solo una 500 e mi sarei reso conto del problema in soli 10 secondi - tuttavia la configurazione errata di CORS significava che una 500 non veniva mai effettivamente restituita perché il middleware CORS non era riuscito per primo. Questo è stato immensamente frustrante a dir poco assoluto! . Tuttavia, voglio aggiungere che qui, nel caso in cui altri si trovino in questa situazione, poiché "inseguivo il coniglio sbagliato", se vuoi. Dopo aver corretto la configurazione CORS, mi sono reso conto che il problema reale non era completamente correlato a CORS.

TL; DR; - A volte gli errori lato server "non CORS" .NET possono essere restituiti come errori CORS se i criteri CORS non sono impostati correttamente

Riferimenti:

https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-3.1#cors-with-named-policy-and-middleware

https://medium.com/swlh/cors-headers-with-dot-net-core-3-5c9dfc664785


1
prova a impostare app.UseCors("foo");primaapp.UseHttpsRedirection();
StepUp

@StepUp grazie per la raccomandazione, ma ancora nessuna fortuna
KMJungersen,

Hai risolto il tuo problema?
StepUp

Qualcuno ha risolto questo problema? Perché nessuna risposta è accettata?
Waseem Ahmad Naeem,

Sì, scusa se non ho mai risolto il problema dopo averlo risolto. Ho aggiunto un aggiornamento alla domanda con qualche contesto aggiuntivo. Grazie!
KMJungersen

Risposte:


21

prima app.UseRouting();alloraapp.UseCors("foo");

Cambia il tuo Configuremetodo come il seguente:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseHttpsRedirection();



    app.UseRouting();  // first
    // Use the CORS policy
    app.UseCors("foo"); // second

    app.UseAuthorization();

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

Ha funzionato per me!


-è necessario un pacchetto nuget?
Chana,

pacchetto nuget per cors
chana

1
@chana - non è necessario installare il pacchetto nuget
AbolfazlR

7
Ero bloccato su questo problema per DAYS! niente da internet ha funzionato. La tua soluzione combinata con il ConfigureServicescodice OP ha risolto il mio problema. Molte grazie!
Tahreem Iqbal,

1
Mi ha lasciato perplesso per anni. Grazie molto!
Myles J,

6

API Web sta utilizzando app.UseHttpsRedirection(); quale causa il CORSproblema se la richiesta del cliente non è httpsbasata. Quindi per usarlo con il httpclient dobbiamo commentare o rimuovere quella riga.

Questo problema non riguarda CORS, https sta causando questo problema, ma l'errore generato lo dice con CORS.


Grazie amico. Ciò ha risolto il mio problema
Reagan Gallant il

1
È corretto! la riga UseHttpsRedirection () deve essere dopo UseCors ()
Eric


0

Mentre stai usando localhost come http://localhost:4200, quindi prova a impostarlo nella tua configurazione:

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options => options.AddPolicy("ApiCorsPolicy", build =>
    {                
        build.WithOrigins("http://localhost:4200")
             .AllowAnyMethod()
             .AllowAnyHeader();
        }));
        // ... other code is omitted for the brevity
     }
}

E Configuremetodo:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider provider)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    app.UseCors("ApiCorsPolicy");
    app.UseHttpsRedirection();
    app.UseAuthentication();
    app.UseMvc();
}

0

Quando si aggiunge il servizio Cors, assicurarsi di includere .SetIsOriginAllowed((host) => true)dopo.WithOrigins("http://localhost:4200")

services.AddCors(options => {
            options.AddPolicy("mypolicy",builder => builder
            .WithOrigins("http://localhost:4200/")
            .SetIsOriginAllowed((host) => true)
            .AllowAnyMethod()
            .AllowAnyHeader());
  });
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.