Cómo habilitar CORS en ASP.NET Core

190

Estoy tratando de habilitar el intercambio de recursos de origen cruzado en mi API web ASP.NET Core, pero estoy atascado.

El EnableCorsatributo acepta policyNamede tipo stringcomo 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é policyNamesignifica y cómo puedo configurar CORS en una API web ASP.NET Core?

Oluwafemi
fuente
1
Aquí está el artículo docs.microsoft.com/en-us/aspnet/core/security/cors
Elaine

Respuestas:

328

Debe configurar una política CORS al inicio de la aplicación en el ConfigureServicesmétodo:

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

    // ...
}

El CorsPolicyBuilderen builderle permite configurar la política para 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");

    // ...

    // This should always be called last to ensure that
    // middleware is registered in the correct order.
    app.UseMvc();
}
Henk Mollema
fuente
12
Encontré que app.UseCors ("MyPolicy") no funcionaba para mis puntos finales API. Necesitaba explícitamente [EnableCors ("MyPolicy")] en los puntos finales del controlador en cuestión.
robbpriestley
9
De los documentos oficiales : "Para habilitar CORS para toda su aplicación, agregue el middleware CORS a su canalización de solicitudes utilizando el UseCorsmétodo de extensión. Tenga en cuenta que el middleware CORS debe preceder a cualquier punto final definido en su aplicación que desee admitir solicitudes de origen cruzado (ej. . antes de cualquier llamada a UseMvc) ".
Alex Klaus
2
Agregué app.UseCors () después de app.AddMvc () y no funcionó. ¡Porque los métodos de orden de uso afectan el funcionamiento del middleware!
Obay Abd-Algader
1
¿Hay algún riesgo de permitir algún origen?
Percy
Esta respuesta no funcionó para mí, debido a la falta del paquete nuget Microsoft.AspNetCore.Cors.
Reven
108

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 el Microsoft.AspNetCore.Corspaquete nuget a su proyecto
  • En ConfigureServicesmétodo, agregueservices.AddCors();
  • En Configuremétodo, antes de llamar app.UseMvc()y app.UseStaticFiles()agregar:

    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 el Microsoft.AspNetCore.Corspaquete nuget a su proyecto
  • en ConfigureServicesmétodo, antes de llamar services.AddMvc(), agregue:

     services.AddCors(options =>
        {
            options.AddPolicy("AllowAll",
                builder =>
                {
                    builder
                    .AllowAnyOrigin() 
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials();
                });
        });
  • (Importante) En el Configuremétodo, antes de llamar app.UseMvc(), agregue app.UseCors("AllowAll");

    AllowAlles el nombre de la política que debemos mencionar en app.UserCors. Podría ser cualquier nombre.

Vahid Amiri
fuente
2
Es cierto, ¡pensé que podía habilitar solo uno de ellos!
eugeneK
77
Gracias. Tenía mis AddCors después de UseMvc y eso estaba causando que no funcionara correctamente. La suya es la única respuesta que menciona esto.
JesseNewman19
1
Esto no funciona, no lo creo. Al proporcionar credenciales, no puede permitir ningún origen. Todavía estoy tratando de hacer que esto funcione.
Jason Goemaat
77
Esa es la pieza clave: .UseCors()antes.UseMvc()
Neps
3
Tiempo perdido sin saber acerca de UseCors antes de UserMvc ... ¡gracias por la ayuda!
Thomas
37

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")]
Oluwafemi
fuente
Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar una aclaración de un autor, deje un comentario debajo de su publicación.
zrvan
14
To critique or request clarification from an authorNo creo que ese sea el caso aquí y la respuesta de Henk ya ha sido marcada. Mi respuesta fue un complemento si desea permitir dominios específicos.
Oluwafemi
Falta algo en su código, 'IServiceCollection' no contiene una definición para 'ConfigureCors'. Por favor verifíquelo e intente dar una respuesta completa.
Sami-L
@ Sami-L Por favor revise mi respuesta actualizada. Descubrí que ConfigureCorsse cambió a AddCors.
Oluwafemi
7

Si está alojando en IIS, una posible razón es que está obteniendo esto porque IIS está bloqueando el OPTIONSverbo. Pasé casi una hora por esto:

Una indicación reveladora es que está recibiendo un 404error durante la OPTIONSsolicitud.

Para solucionar esto, debe decirle explícitamente a IIS que no bloquee la OPTIONSsolicitud.

Vaya a Solicitud de filtrado:

Filtro de solicitud de IIS

Asegúrese de que las OPCIONES estén permitidas:

Asegúrese de que las OPCIONES sean verdaderas

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>
Rosdi Kasim
fuente
7

Tienes que configurar en la clase Startup.cs

services.AddCors(options =>
        {
            options.AddPolicy("CorsPolicy",
                builder => builder.AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader()
                .AllowCredentials());
        });
Sunil Dhappadhule
fuente
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"));
        });            
    }

``

Nathan Alard
fuente
1
Maravillosa manera de eludir la seguridad del navegador ya implementada. Simplemente no!
JCKödel
2
No creo que esto deba ser rechazado. Esta es una forma "alternativa". Puede usar el método "UseCors ()" o agregar un filtro MVC global como lo que hizo Nathan aquí.
Josh Mouch
esto funciona para mí en .net core 2.2 más agregando app.UseCors ("AllowAnyOrigin"); en el método "Configurar"
Harry Sarshogh
Es importante "Agregar el paquete nuget Microsoft.AspNetCore.Cors a su proyecto". Gracias por mencionarlo!
Mason Zhang el
5

Conseguí esto trabajando con .Net Core 3.1 de la siguiente manera

1.Asegúrese de colocar el código UseCors entre app.UseRouting (); y app.UseAuthentication ();

        app.UseHttpsRedirection();

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

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

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

2. Luego coloque este código en el método ConfigureServices

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

3. Y encima del controlador base coloqué esto

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

Ahora todos mis controladores heredarán de BaseController y tendrán CORS habilitado

tfa
fuente
Las cosas no estaban funcionando para mí hasta que yoplace the UseCors code between app.UseRouting(); and app.UseAuthentication();
0014
1

Paso 1: Necesitamos el paquete Microsoft.AspNetCore.Cors en nuestro proyecto. Para la instalación, vaya a Herramientas -> Administrador de paquetes NuGet -> Administrar paquetes NuGet para la solución. Busque Microsoft.AspNetCore.Cors e instale el paquete.

Paso 2: Necesitamos inyectar CORS en el contenedor para que pueda ser utilizado por la aplicación. En la clase Startup.cs, vayamos al método ConfigureServices y registremos CORS.

ingrese la descripción de la imagen aquí

Entonces, en nuestra aplicación de servidor, vamos a Controladores -> HomeController.cs y agreguemos el decorador EnableCors al método Index (o su controlador y acción específicos):

ingrese la descripción de la imagen aquí

Para más detalles haga clic aquí

shebin c babu
fuente
0

Toda la solución mencionada anteriormente puede funcionar o no, en la mayoría de los casos no funcionará. He dado la solución aquí

Actualmente estoy trabajando en Angular y Web API (.net Core) y encontré el problema CORS explicado a continuación

La solución proporcionada anteriormente siempre funcionará. Con la solicitud 'OPCIONES' es realmente necesario habilitar 'Autenticación anónima'. Con la solución mencionada aquí, no tiene que hacer todos los pasos mencionados anteriormente, como la configuración de IIS.

De todos modos, alguien marcó mi publicación anterior como duplicada con esta publicación, pero puedo ver que esta publicación es solo para habilitar CORS en ASP.net Core, pero mi publicación está relacionada con Habilitar e implementar CORS en ASP.net Core y Angular.

Shivang Kaul
fuente