Se uma solicitação HTTP for feita para um ponto de extremidade habilitado para CORS onde um cabeçalho de solicitação HTTP origin
não for especificado, a solicitação falhará com um erro HTTP 500.
A exceção nos registros é:
[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)
No entanto, app.Cors()
_has_ foi adicionado ao aplicativo antes de app.UseEndpoints(...)
.
Isso parece ter sido introduzido por # 9181.
Se a solicitação não tiver um cabeçalho de solicitação origin
, o middleware CORS será ignorado:
No entanto, o middleware do endpoint encontra os metadados CORS no endpoint que está sendo chamado e verifica se o middleware CORS foi chamado (o que foi, mas foi ignorado porque não era necessário) procurando uma chave no HttpContext
Itens. O item não está presente, então uma exceção é lançada:
A chave que está sendo testada pelo middleware do endpoint só é adicionada se o cabeçalho origin
estiver presente na solicitação, que está aqui:
Parece que duas soluções possíveis são:
HttpContext.Items
ou:origin
se metadados CORS estão presentes no endpoint e só lança a exceção para a não chamada do middleware CORS se ele estiver presente na solicitação HTTP.[EnableCors(...)]
a um método de controlador.A solicitação é bem-sucedida se nenhum cabeçalho de solicitação origin
HTTP for fornecido.
.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
O problema foi encontrado como parte do compromisso com um aplicativo sandbox simples: https://github.com/martincostello/api/pull/109/commits/a40a99f2dbb82d17ce6cc7cde5e13bc400d78137
cc @pranavkm
Para preview4, as possíveis soluções alternativas incluem:
1) Ter um middleware que define o valor em HttpContext.Items
após UseCors()
`` `C #
app.UseCors ();
app.Use ((contexto, próximo) =>
{
context.Items ["__ CorsMiddlewareInvoked"] = verdadeiro;
retornar próximo ();
});
2) Disable the check in `EndpointRouting`:
```C#
services.AddRouting(r => r.SuppressCheckForUnhandledSecurityMetadata = true);
O primeiro seria o preferido, pois não está removendo a verificação de um aplicativo configurado incorretamente.
Comentários muito úteis
Para preview4, as possíveis soluções alternativas incluem:
1) Ter um middleware que define o valor em
HttpContext.Items
apósUseCors()
`` `C #
app.UseCors ();
app.Use ((contexto, próximo) =>
{
context.Items ["__ CorsMiddlewareInvoked"] = verdadeiro;
retornar próximo ();
});
O primeiro seria o preferido, pois não está removendo a verificação de um aplicativo configurado incorretamente.