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?


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

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.


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")]

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>

7

Tienes que configurar en la clase 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
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


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í


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.