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é :
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 :
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 :
Il semblerait que deux correctifs possibles soient :
HttpContext.Items
, ou :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.[EnableCors(...)]
Ă une mĂ©thode de contrĂŽleur.La requĂȘte aboutit si aucun en-tĂȘte de requĂȘte HTTP origin
n'est fourni.
.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
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.
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ĂšsUseCors()
```C#
app.UseCors();
app.Use((contexte, suivant) =>
{
context.Items["__CorsMiddlewareInvoked"] = true ;
retour suivant();
});
Le premier serait préférable car il ne supprime pas le contrÎle d'une application mal configurée.