Come abilitare CORS in ASP.NET Core


190

Sto cercando di abilitare la condivisione delle risorse tra le origini sulla mia API Web ASP.NET Core, ma sono bloccato.

L' EnableCorsattributo accetta policyNamedi tipo stringcome parametro:

// 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);

Che cosa policyNamesignifica e come posso configurare CORS su un'API Web ASP.NET Core?


Risposte:


328

È necessario configurare un criterio CORS all'avvio dell'applicazione nel ConfigureServicesmetodo:

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

    // ...
}

L' CorsPolicyBuilderin builderconsente di configurare la politica alle proprie esigenze. È ora possibile utilizzare questo nome per applicare la politica ai controller e alle azioni:

[EnableCors("MyPolicy")]

O applicalo a ogni richiesta:

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();
}

12
Ho scoperto che app.UseCors ("MyPolicy") non ha funzionato per i miei endpoint API. Ho dovuto esplicitamente [EnableCors ("MyPolicy")] sugli endpoint del controller in questione.
Robbpriestley,

9
Dai documenti ufficiali : "Per abilitare CORS per l'intera applicazione aggiungere il middleware CORS alla pipeline della richiesta utilizzando il UseCorsmetodo di estensione. Si noti che il middleware CORS deve precedere qualsiasi endpoint definito nella propria app che si desidera supportare richieste tra origini (es . prima di qualsiasi chiamata a UseMvc). "
Alex Klaus,

2
Ho aggiunto app.UseCors () dopo app.AddMvc () e non ha funzionato. Perché i metodi di ordine d'uso influenzano il funzionamento del middleware!
Obay Abd-Algader,

1
Ci sono dei rischi nel consentire qualsiasi origine?
Percy,

Questa risposta non ha funzionato per me, a causa della mancanza del pacchetto nuget Microsoft.AspNetCore.Cors.
Reven,

108

Si applica a .NET Core 1 e .Net Core 2 (più in basso)

Se si utilizza .Net-Core 1.1

Purtroppo i documenti sono molto confusi in questo caso specifico. Quindi lo renderò estremamente semplice:

  • Aggiungi il Microsoft.AspNetCore.Corspacchetto nuget al tuo progetto
  • Nel ConfigureServicesmetodo, aggiungiservices.AddCors();
  • Nel Configuremetodo, prima di chiamare app.UseMvc()e app.UseStaticFiles(), aggiungi:

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

Questo è tutto. Ogni client ha accesso al tuo sito Web / API ASP.NET Core.


Se si utilizza .Net-Core 2.0

  • Aggiungi il Microsoft.AspNetCore.Corspacchetto nuget al tuo progetto
  • nel ConfigureServicesmetodo, prima di chiamare services.AddMvc(), aggiungi:

     services.AddCors(options =>
        {
            options.AddPolicy("AllowAll",
                builder =>
                {
                    builder
                    .AllowAnyOrigin() 
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials();
                });
        });
  • (Importante) Nel Configuremetodo, prima di chiamare app.UseMvc(), aggiungere app.UseCors("AllowAll");

    AllowAllè il nome della politica che dobbiamo menzionare in app.UserCors. Potrebbe essere qualsiasi nome.


2
vero, ho pensato di poter abilitare solo uno di loro!
EugeneK,

7
Grazie. Avevo i miei AddCors dopo UseMvc e questo non funzionava correttamente. La tua è l'unica risposta che menziona questo.
JesseNewman19

1
Questo non funziona, non credo. Quando si forniscono credenziali, non è possibile consentire alcuna origine. Sto ancora cercando di farlo funzionare.
Jason Goemaat il

7
Questo è il pezzo chiave: .UseCors()prima.UseMvc()
Neps,

3
Sprecato tempo a non conoscere UseCors prima di UserMvc ... grazie per l'aiuto!
Thomas,

37

Sulla base della risposta di Henk sono stato in grado di trovare il dominio specifico, il metodo che voglio consentire e anche l'intestazione che voglio abilitare CORS per:

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

utilizzo:

[EnableCors("AllowSpecific")]

Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti a un autore, lascia un commento sotto il suo post.
zrvan,

14
To critique or request clarification from an authorNon penso che sia così e la risposta di Henk sia già stata contrassegnata. La mia risposta è stata un componente aggiuntivo se si desidera consentire domini specifici.
Oluwafemi, l'

Manca qualcosa nel tuo codice, "IServiceCollection" non contiene una definizione per "ConfigureCors". Si prega di controllare e provare a dare una risposta completa.
Sami-L,

@ Sami-L Controlla la mia risposta aggiornata. Ho scoperto che è ConfigureCorsstato modificato in AddCors.
Oluwafemi,


7

Se stai ospitando su IIS, un possibile motivo è che stai ottenendo questo perché IIS sta bloccando il OPTIONSverbo. Ho trascorso quasi un'ora per questo:

Un'indicazione rivelatrice è che stai ricevendo un 404errore durante la OPTIONSrichiesta.

Per risolvere questo problema, è necessario indicare esplicitamente a IIS di non bloccare la OPTIONSrichiesta.

Vai a Filtro richieste:

Filtro richieste IIS

Assicurarsi che le OPZIONI siano consentite:

Assicurati che OPTIONS sia True

Oppure, basta creare un web.configcon la seguente impostazione:

<system.webServer>
    <security>
        <requestFiltering>
            <verbs>
                <remove verb="OPTIONS" />
                <add verb="OPTIONS" allowed="true" />
            </verbs>
        </requestFiltering>
    </security>
</system.webServer>

7

Devi configurare nella classe Startup.cs

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

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"));
        });            
    }

`


1
Modo meraviglioso per aggirare la sicurezza del browser già distribuita. Non farlo!
JCKödel,

2
Non penso che questo dovrebbe essere votato verso il basso. Questo è un modo "alternativo". Puoi usare il metodo "UseCors ()" oppure aggiungere un filtro MVC globale come quello che Nathan ha fatto qui.
Josh Mouch,

questo funziona per me su .net core 2.2 oltre ad aggiungere app.UseCors ("AllowAnyOrigin"); nel metodo "Configura"
Harry Sarshogh

È importante "Aggiungi il pacchetto nuget Microsoft.AspNetCore.Cors al tuo progetto". Grazie per averlo menzionato!
Mason Zhang,

5

Ha funzionato con .Net Core 3.1 come segue

1.Assicurati di inserire il codice UseCors tra app.UseRouting (); e app.UseAuthentication ();

        app.UseHttpsRedirection();

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

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

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

2. Quindi inserire questo codice nel metodo ConfigureServices

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

3.E sopra il controller di base ho inserito questo

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

Ora tutti i miei controller erediteranno dal BaseController e avranno CORS abilitato


Le cose non hanno funzionato per me fino a quando ioplace the UseCors code between app.UseRouting(); and app.UseAuthentication();
0014

1

Passaggio 1: abbiamo bisogno del pacchetto Microsoft.AspNetCore.Cors nel nostro progetto. Per l'installazione vai su Strumenti -> Gestione pacchetti NuGet -> Gestisci pacchetti NuGet per soluzione. Cerca Microsoft.AspNetCore.Cors e installa il pacchetto.

Passaggio 2: è necessario iniettare CORS nel contenitore in modo che possa essere utilizzato dall'applicazione. Nella classe Startup.cs, andiamo al metodo ConfigureServices e registriamo CORS.

inserisci qui la descrizione dell'immagine

Quindi, nella nostra app server, andiamo su Controller -> HomeController.cs e aggiungiamo il decoratore EnableCors al metodo Index (O il tuo controller e azione specifici):

inserisci qui la descrizione dell'immagine

Per maggiori dettagli clicca qui


0

Tutta la soluzione sopra menzionata potrebbe funzionare o non funzionare, nella maggior parte dei casi non funzionerà. Ho dato la soluzione qui

Attualmente sto lavorando su API angolare e Web (.net Core) e ho riscontrato il problema CORS spiegato di seguito

La soluzione fornita sopra funzionerà sempre. Con la richiesta 'OPZIONI' è davvero necessario abilitare 'Autenticazione anonima'. Con la soluzione menzionata qui non è necessario eseguire tutti i passaggi sopra menzionati, come le impostazioni IIS.

Comunque qualcuno ha contrassegnato il mio post sopra come duplicato con questo post, ma posso vedere che questo post è solo per abilitare CORS in ASP.net Core, ma il mio post è correlato, Abilitare e implementare CORS in ASP.net Core e Angolare.

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.