Aspnetcore: HTTP 500 se a solicitação para um endpoint habilitado para CORS for solicitada sem um cabeçalho de origem

Criado em 13 abr. 2019  ·  3Comentários  ·  Fonte: dotnet/aspnetcore

Descreva o bug

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:

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

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:

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

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:

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

Parece que duas soluções possíveis são:

  1. O middleware CORS sempre adiciona o valor "Executei" a HttpContext.Items ou:
  2. O middleware do endpoint _also_ verifica o cabeçalho 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.

Reproduzir

  1. Configure um aplicativo ASP.NET Core MVC para usar CORS.
  2. Adicione o atributo [EnableCors(...)] a um método de controlador.
  3. Inicie o aplicativo.
  4. Execute uma solicitação HTTP padrão (por exemplo, com cURL) para o terminal.

Comportamento esperado

A solicitação é bem-sucedida se nenhum cabeçalho de solicitação origin HTTP for fornecido.

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

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ó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.

Todos 3 comentários

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.

Esta página foi útil?
0 / 5 - 0 avaliações