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:
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:
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í:
Parece que dos posibles soluciones son:
HttpContext.Items
, o: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.[EnableCors(...)]
a un método de controlador.La solicitud se realiza correctamente si no se proporciona un encabezado de solicitud HTTP origin
.
.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
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.
Comentario más útil
Para Preview4, las posibles soluciones incluyen:
1) Tener un middleware que establezca el valor en
HttpContext.Items
después deUseCors()
`` C #
app.UseCors ();
app.Use ((contexto, siguiente) =>
{
context.Items ["__ CorsMiddlewareInvoked"] = verdadero;
volver siguiente ();
});
Se preferiría el primero, ya que no elimina un cheque de una aplicación mal configurada.