asp.net-core
Richieste di origine incrociata (CORS)
Ricerca…
Osservazioni
La sicurezza del browser impedisce a una pagina web di inoltrare richieste AJAX a un altro dominio. Questa restrizione è denominata criterio di origine identica e impedisce a un sito dannoso di leggere i dati riservati da un altro sito. Tuttavia, a volte potresti voler consentire ad altri siti di effettuare richieste di origine incrociata alla tua app web.
Cross Origin Resource Sharing (CORS) è uno standard W3C che consente a un server di attenuare la politica dell'origine stessa. Utilizzando CORS, un server può consentire esplicitamente alcune richieste di origine incrociata mentre respinge le altre. CORS è più sicuro e più flessibile rispetto alle tecniche precedenti come JSONP.
Abilita CORS per tutte le richieste
Utilizzare il metodo di estensione UseCors()
su IApplicationBuilder
nel metodo Configure
per applicare la politica CORS a tutte le richieste.
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddCors();
}
public void Configure(IApplicationBuilder app)
{
// Other middleware..
app.UseCors(builder =>
{
builder.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod();
});
// Other middleware..
app.UseMvc();
}
Abilita la politica CORS per controller specifici
Per abilitare una determinata politica CORS per controller specifici, è necessario creare la politica nell'estensione AddCors
all'interno del metodo ConfigureServices
:
services.AddCors(cors => cors.AddPolicy("AllowAll", policy =>
{
policy.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
}));
Ciò consente di applicare la politica a un controller:
[EnableCors("AllowAll")]
public class HomeController : Controller
{
// ...
}
Politiche CORS più sofisticate
Il builder di criteri consente di creare policy sofisticate.
app.UseCors(builder =>
{
builder.WithOrigins("http://localhost:5000", "http://myproductionapp.com")
.WithMethods("GET", "POST", "HEAD")
.WithHeaders("accept", "content-type", "origin")
.SetPreflightMaxAge(TimeSpan.FromDays(7));
});
Questo criterio consente solo le origini http://localhost:5000
e http://myproductionapp.com
con solo i metodi GET
, POST
e HEAD
e accetta solo le intestazioni HTTP di content-type
accept
, content-type
e di origin
. Il metodo SetPreflightMaxAge
fa in modo che i browser memorizzino nella cache il risultato della richiesta di preflight ( OPTIONS
) da memorizzare nella cache per il periodo di tempo specificato.
Abilita la politica CORS per tutti i controller
Per abilitare un criterio CORS su tutti i controller MVC, è necessario creare il criterio nell'estensione AddCors all'interno del metodo ConfigureServices e quindi impostare il criterio su CorsAuthorizationFilterFactory
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Cors.Internal;
...
public void ConfigureServices(IServiceCollection services) {
// Add AllowAll policy just like in single controller example.
services.AddCors(options => {
options.AddPolicy("AllowAll",
builder => {
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
});
});
// Add framework services.
services.AddMvc();
services.Configure<MvcOptions>(options => {
options.Filters.Add(new CorsAuthorizationFilterFactory("AllowAll"));
});
}
public void Configure(IApplicationBuilder app) {
app.useMvc();
// For content not managed within MVC. You may want to set the Cors middleware
// to use the same policy.
app.UseCors("AllowAll");
}
Questo criterio CORS può essere sovrascritto su un controller o su una base azione, ma può impostare l'impostazione predefinita per l'intera applicazione.