Aspnetcore: HTTP 500 si la demande Ă  un point de terminaison compatible CORS est demandĂ©e sans en-tĂȘte d'origine

CrĂ©Ă© le 13 avr. 2019  Â·  3Commentaires  Â·  Source: dotnet/aspnetcore

DĂ©crivez le bogue

Si une requĂȘte HTTP est envoyĂ©e Ă  un point de terminaison CORS oĂč aucun en-tĂȘte de requĂȘte HTTP origin n'est spĂ©cifiĂ©, la requĂȘte Ă©choue avec une erreur HTTP 500.

L'exception dans les journaux est :

[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)

Cependant, app.Cors() _a_ été ajouté à l'application avant app.UseEndpoints(...) .

Cela semble avoir été introduit par #9181.

Si la requĂȘte n'a pas d'en-tĂȘte de requĂȘte origin , le middleware CORS est ignoré :

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

Cependant, le middleware du point de terminaison trouve les métadonnées CORS sur le point de terminaison invoqué et vérifie si le middleware CORS a été invoqué (ce qu'il était, mais a été ignoré car non nécessaire) en recherchant une clé dans le HttpContext 's éléments. L'élément n'est pas présent, une exception est donc levée :

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

La clĂ© testĂ©e par le middleware du point de terminaison n'est ajoutĂ©e que si l'en-tĂȘte origin est prĂ©sent dans la requĂȘte, qui est ici :

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

Il semblerait que deux correctifs possibles soient :

  1. Le middleware CORS ajoute toujours la valeur "J'ai exécuté" à HttpContext.Items , ou :
  2. Le middleware du point de terminaison vĂ©rifie _aussi_ l'en-tĂȘte origin si les mĂ©tadonnĂ©es CORS sont prĂ©sentes sur le point de terminaison, et ne lĂšve l'exception pour la non-invocation du middleware CORS que s'il est prĂ©sent dans la requĂȘte HTTP.

Reproduire

  1. Configurez une application ASP.NET Core MVC pour utiliser CORS.
  2. Ajoutez l'attribut [EnableCors(...)] à une méthode de contrÎleur.
  3. Lancez l'application.
  4. Effectuez une requĂȘte HTTP standard (par exemple avec cURL) au point de terminaison.

Comportement prévisible

La requĂȘte aboutit si aucun en-tĂȘte de requĂȘte HTTP origin n'est fourni.

Contexte supplémentaire

.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

Commentaire le plus utile

Pour preview4, les solutions de contournement possibles incluent :

1) Avoir un middleware qui définit la valeur dans HttpContext.Items aprÚs UseCors()

```C#
app.UseCors();

app.Use((contexte, suivant) =>
{
context.Items["__CorsMiddlewareInvoked"] = true ;
retour suivant();
});


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

Le premier serait préférable car il ne supprime pas le contrÎle d'une application mal configurée.

Tous les 3 commentaires

Un problÚme a été trouvé dans le cadre de cette validation dans une simple application sandbox : https://github.com/martincostello/api/pull/109/commits/a40a99f2dbb82d17ce6cc7cde5e13bc400d78137

cc @pranavkm

Pour preview4, les solutions de contournement possibles incluent :

1) Avoir un middleware qui définit la valeur dans HttpContext.Items aprÚs UseCors()

```C#
app.UseCors();

app.Use((contexte, suivant) =>
{
context.Items["__CorsMiddlewareInvoked"] = true ;
retour suivant();
});


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

Le premier serait préférable car il ne supprime pas le contrÎle d'une application mal configurée.

Cette page vous a été utile?
0 / 5 - 0 notes