Aspnetcore: HTTP 500 si se solicita una solicitud a un punto final habilitado para CORS sin un encabezado de origen

Creado en 13 abr. 2019  ·  3Comentarios  ·  Fuente: dotnet/aspnetcore

Describe el error

Si se realiza una solicitud HTTP a un extremo habilitado para CORS donde no se especifica un encabezado de solicitud HTTP origin , la solicitud falla con un error HTTP 500.

La excepción en los registros es:

[2019-04-13 14:40:04Z] fail: Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware[1]
      An unhandled exception has occurred while executing the request.
System.InvalidOperationException: Endpoint MartinCostello.Api.Controllers.TimeController.Get (API) contains CORS metadata, but a middleware was not found that supports CORS.
Configure your application startup by adding app.UseCors() inside the call to Configure(..) in the application startup code.
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.ThrowMissingCorsMiddlewareException(Endpoint endpoint)
   at Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke(HttpContext httpContext)
   at Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.Invoke(HttpContext httpContext)
   at Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.HttpOverrides.HttpMethodOverrideMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

Sin embargo, app.Cors() _ se ha agregado a la aplicación antes de app.UseEndpoints(...) .

Esto parece haber sido introducido por # 9181.

Si la solicitud no tiene un encabezado de solicitud origin , se omite el middleware CORS:

https://github.com/aspnet/AspNetCore/blob/b93bc433db66175d2b07b128ec9990f7a4dd7e1b/src/Middleware/CORS/src/Infrastructure/CorsMiddleware.cs#L122 -L125

Sin embargo, el middleware punto final descubre los metadatos CORS en el punto final que se invoca, y comprueba si se invocó el CORS middleware (que era, pero se omite que no es necesario) mediante la búsqueda de una llave en los HttpContext 's artículos. El elemento no está presente, por lo que se lanza una excepción:

https://github.com/aspnet/AspNetCore/blob/84da613d2c03b6f1c0fa3c01828923ec3415d525/src/Http/Routing/src/EndpointMiddleware.cs#L51 -L55

La clave que está probando el middleware de punto final solo se agrega si el encabezado origin está presente en la solicitud, que está aquí:

https://github.com/aspnet/AspNetCore/blob/b93bc433db66175d2b07b128ec9990f7a4dd7e1b/src/Middleware/CORS/src/Infrastructure/CorsMiddleware.cs#L140 -L141

Parece que dos posibles soluciones son:

  1. El middleware CORS siempre agrega el valor "He ejecutado" a HttpContext.Items , o:
  2. El middleware de punto final _también_ comprueba el encabezado origin si hay metadatos CORS presentes en el punto final, y solo lanza la excepción para la no invocación del middleware CORS si está presente en la solicitud HTTP.

Reproducir

  1. Configure una aplicación ASP.NET Core MVC para usar CORS.
  2. Agregue el atributo [EnableCors(...)] a un método de controlador.
  3. Iniciar la aplicacion.
  4. Realice una solicitud HTTP estándar (por ejemplo, con cURL) al punto final.

Comportamiento esperado

La solicitud se realiza correctamente si no se proporciona un encabezado de solicitud HTTP origin .

Contexto adicional

.NET Core SDK (reflecting any global.json):
 Version:   3.0.100-preview4-011204
 Commit:    621575bab1

Runtime Environment:
 OS Name:     Windows
 OS Version:  10.0.17763
 OS Platform: Windows
 RID:         win10-x64
 Base Path:   C:\Program Files\dotnet\sdk\3.0.100-preview4-011204\

Host (useful for support):
  Version: 3.0.0-preview4-27612-09
  Commit:  64e9c3e1cd
Done area-mvc bug

Comentario más útil

Para Preview4, las posibles soluciones incluyen:

1) Tener un middleware que establezca el valor en HttpContext.Items después de UseCors()

`` C #
app.UseCors ();

app.Use ((contexto, siguiente) =>
{
context.Items ["__ CorsMiddlewareInvoked"] = verdadero;
volver siguiente ();
});


2) Disable the check in `EndpointRouting`:
```C#
services.AddRouting(r => r.SuppressCheckForUnhandledSecurityMetadata = true);

Se preferiría el primero, ya que no elimina un cheque de una aplicación mal configurada.

Todos 3 comentarios

Se encontró un problema como parte de este compromiso con una aplicación de caja de arena simple: https://github.com/martincostello/api/pull/109/commits/a40a99f2dbb82d17ce6cc7cde5e13bc400d78137

cc @pranavkm

Para Preview4, las posibles soluciones incluyen:

1) Tener un middleware que establezca el valor en HttpContext.Items después de UseCors()

`` C #
app.UseCors ();

app.Use ((contexto, siguiente) =>
{
context.Items ["__ CorsMiddlewareInvoked"] = verdadero;
volver siguiente ();
});


2) Disable the check in `EndpointRouting`:
```C#
services.AddRouting(r => r.SuppressCheckForUnhandledSecurityMetadata = true);

Se preferiría el primero, ya que no elimina un cheque de una aplicación mal configurada.

¿Fue útil esta página
0 / 5 - 0 calificaciones