c# - mvc - Cómo habilitar CORS en ASP.NET Core
enable cors web config (7)
Tienes que configurar en la clase Startup.cs
services.AddCors(options =>
{
options.AddPolicy("CorsPolicy",
builder => builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials());
});
Estoy tratando de habilitar el intercambio de recursos de origen cruzado en mi API web ASP.NET Core, pero estoy atascado.
El atributo
EnableCors
acepta
policyName
de tipo
string
como parámetro:
// 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é significa
policyName
y cómo puedo configurar
CORS
en una API web ASP.NET Core?
Basado en la respuesta de Henk, he podido encontrar el dominio específico, el método que quiero permitir y también el encabezado para el que quiero habilitar CORS:
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
options.AddPolicy("AllowSpecific", p => p.WithOrigins("http://localhost:1233")
.WithMethods("GET")
.WithHeaders("name")));
services.AddMvc();
}
uso:
[EnableCors("AllowSpecific")]
Debe configurar una política CORS al inicio de la aplicación en el método
ConfigureServices
:
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
{
builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader();
}));
// ...
}
CorsPolicyBuilder
en el
builder
permite configurar la política según sus necesidades.
Ahora puede usar este nombre para aplicar la política a controladores y acciones:
[EnableCors("MyPolicy")]
O aplíquelo a cada solicitud:
public void Configure(IApplicationBuilder app)
{
app.UseCors("MyPolicy");
// ...
}
Específicamente en dotnet core 2.2 con SignalR debes cambiar
.WithOrigins("http://localhost:3000")
o
.SetIsOriginAllowed(isOriginAllowed: _ => true) //for all origins
en
.AllowAnyOrigin()
lugar
.AllowAnyOrigin()
con
.AllowCredentials()
https://trailheadtechnology.com/breaking-change-in-aspnetcore-2-2-for-signalr-and-cors/
Si está alojando en IIS, una posible razón es que está obteniendo esto porque IIS está bloqueando el verbo
OPTIONS
.
Pasé casi una hora por esto:
Una indicación reveladora es que está recibiendo un error
404
durante la solicitud de
OPTIONS
.
Para solucionar esto, debe decirle explícitamente a IIS que
no
bloquee la solicitud de
OPTIONS
.
Vaya a Solicitud de filtrado:
Asegúrese de que las OPCIONES estén permitidas:
O simplemente cree un
web.config
con la siguiente configuración:
<system.webServer>
<security>
<requestFiltering>
<verbs>
<remove verb="OPTIONS" />
<add verb="OPTIONS" allowed="true" />
</verbs>
</requestFiltering>
</security>
</system.webServer>
``
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"));
});
}
``
Se aplica a .NET Core 1 y .Net Core 2 (más abajo)
Si usa
.Net-Core 1.1
Lamentablemente, los documentos son muy confusos en este caso específico. Así que lo haré muy simple:
-
Agregue
Microsoft.AspNetCore.Cors
paquete nugetMicrosoft.AspNetCore.Cors
a su proyecto -
En el método
ConfigureServices
, agregueservices.AddCors();
-
En el método
Configure
, antes de llamar aapp.UseMvc()
yapp.UseStaticFiles()
, agregue:app.UseCors(builder => builder .AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader() .AllowCredentials());
Eso es. Cada cliente tiene acceso a su sitio web / API de ASP.NET Core.
Si usa
.Net-Core 2.0
-
Agregue
Microsoft.AspNetCore.Cors
paquete nugetMicrosoft.AspNetCore.Cors
a su proyecto -
en el método
ConfigureServices
, antes de llamar aservices.AddMvc()
, agregue:services.AddCors(options => { options.AddPolicy("AllowAll", builder => { builder .AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader() .AllowCredentials(); }); });
-
(Importante) En el método
Configure
, antes de llamar aapp.UseMvc()
, agregueapp.UseCors("AllowAll");
AllowAll
es el nombre de la política que debemos mencionar en app.UserCors. Podría ser cualquier nombre.