Problemas con la política CORS y .NET Core 3.1

12

No estoy seguro de lo que me falta, pero parece que mi política CORS no funciona con .NET Core 3.1 y Angular 8 del lado del cliente.

Startup.cs:

        public void ConfigureServices(IServiceCollection services)
        {
            // ...

            // Add CORS policy
            services.AddCors(options =>
            {
                options.AddPolicy("foo",
                builder =>
                {
                    // Not a permanent solution, but just trying to isolate the problem
                    builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();
                });
            });

            services.AddControllers();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseHttpsRedirection();

            // Use the CORS policy
            app.UseCors("foo");

            app.UseRouting();

            app.UseAuthorization();

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

Mensaje de error del lado del cliente:

Access to XMLHttpRequest at 'https://localhost:8082/api/auth/' from origin 'http://localhost:4200' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

ACTUALIZAR:

Aunque estaba configurando CORS incorrectamente (y la respuesta aceptada a continuación ayudó de hecho con eso) la raíz del problema no estaba relacionada. Para un contexto adicional, la aplicación funcionaba completamente bien cuando ejecutaba la API y la aplicación Angular usando la CLI: solo tenía este problema después de implementarlos en un servidor web.

El problema "real" terminó relacionado con la conexión SQL, que solo descubrí después de agregar el registro de errores de archivos planos a la API y ejecutar un seguimiento de SQL Server para descubrir que la aplicación no podía conectarse a SQL en absoluto.

Normalmente esperaría que esto solo devuelva un 500 y me habría dado cuenta del problema en cuestión de 10 segundos; sin embargo, la configuración incorrecta de CORS significaba que nunca se devolvió un 500 porque el middleware CORS falló primero. ¡Esto fue inmensamente frustrante por decir lo menos! . Sin embargo, quiero agregar eso aquí en caso de que otros se encuentren en esta situación, ya que estaba "persiguiendo al conejo equivocado", por así decirlo. Después de arreglar la configuración de CORS, me di cuenta de que el problema real no tenía ninguna relación con CORS.

TL; DR; - A veces, los errores del lado del servidor ".NET que no son CORS" se pueden devolver como errores CORS si las políticas CORS no se establecen correctamente

Referencias

https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-3.1#cors-with-named-policy-and-middleware

https://medium.com/swlh/cors-headers-with-dot-net-core-3-5c9dfc664785

KMJungersen
fuente
1
intenta configurar app.UseCors("foo");antesapp.UseHttpsRedirection();
StepUp
@StepUp gracias por la recomendación, pero todavía no
tuve
¿Has resuelto tu problema?
StepUp
¿Alguien ha resuelto este problema? ¿Por qué no se acepta respuesta?
Waseem Ahmad Naeem
Sí, lo siento, nunca volví a este problema después de resolverlo. He agregado una actualización a la pregunta con algún contexto adicional. ¡Gracias!
KMJungersen

Respuestas:

21

primero app.UseRouting();luegoapp.UseCors("foo");

Cambie su Configuremétodo de la siguiente manera:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseHttpsRedirection();



    app.UseRouting();  // first
    // Use the CORS policy
    app.UseCors("foo"); // second

    app.UseAuthorization();

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

¡Funcionó para mí!

AbolfazlR
fuente
-¿Es necesario un paquete nuget?
chana
paquete nuget para cors
chana
1
@chana - no necesitas instalar el paquete nuget
AbolfazlR
77
¡Estaba atrapado en este problema por DÍAS! nada de internet funcionó. Su solución combinada con el ConfigureServicescódigo de OP resolvió mi problema. ¡Muchas gracias!
Tahreem Iqbal
1
Me había dejado perplejo por años. ¡Muchas gracias!
Myles J
6

API web está utilizando app.UseHttpsRedirection(); que causan CORSproblemas si la solicitud del cliente no está httpsbasada. Entonces, para usarlo con el httpcliente, necesitamos comentar o eliminar esa línea.

Este problema no es con CORS, el https está causando este problema, pero el error arrojado dice que está con CORS.

Waseem Ahmad Naeem
fuente
Gracias hombre. Esto resolvió mi problema
Reagan Gallant
1
¡Eso es correcto! la línea UseHttpsRedirection () debe estar después de UseCors ()
Eric
0

Como está utilizando localhost como http://localhost:4200, intente configurarlo en su configuración:

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options => options.AddPolicy("ApiCorsPolicy", build =>
    {                
        build.WithOrigins("http://localhost:4200")
             .AllowAnyMethod()
             .AllowAnyHeader();
        }));
        // ... other code is omitted for the brevity
     }
}

Y Configuremétodo:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider provider)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    app.UseCors("ApiCorsPolicy");
    app.UseHttpsRedirection();
    app.UseAuthentication();
    app.UseMvc();
}
Aumentar
fuente
0

Al agregar el Servicio Cors, asegúrese de incluir .SetIsOriginAllowed((host) => true)después.WithOrigins("http://localhost:4200")

services.AddCors(options => {
            options.AddPolicy("mypolicy",builder => builder
            .WithOrigins("http://localhost:4200/")
            .SetIsOriginAllowed((host) => true)
            .AllowAnyMethod()
            .AllowAnyHeader());
  });
Sean Baraka
fuente