Wenn eine HTTP-Anforderung an einen CORS-fähigen Endpunkt gestellt wird, für den kein HTTP-Anforderungsheader origin
angegeben ist, schlägt die Anforderung mit einem HTTP-500-Fehler fehl.
Die Ausnahme in den Protokollen ist:
[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)
app.Cors()
_wurde_ jedoch vor app.UseEndpoints(...)
zur Anwendung hinzugefügt.
Dies scheint von #9181 eingeführt worden zu sein.
Wenn die Anfrage keinen origin
Anfrageheader hat, wird die CORS-Middleware übersprungen:
Die Endpunkt-Middleware findet jedoch die CORS-Metadaten auf dem aufgerufenen Endpunkt und überprüft, ob die CORS-Middleware aufgerufen wurde (was es war, aber als nicht benötigt übersprungen wurde), indem sie nach einem Schlüssel in den HttpContext
s sucht Artikel. Das Element ist nicht vorhanden, daher wird eine Ausnahme ausgelöst:
Der von der Endpunkt-Middleware getestete Schlüssel wird nur hinzugefügt, wenn der Header origin
in der Anfrage vorhanden ist, die hier ist:
Es scheint, dass zwei mögliche Korrekturen entweder sind:
HttpContext.Items
, oder:origin
Header, wenn CORS-Metadaten auf dem Endpunkt vorhanden sind, und löst nur die Ausnahme für den Nichtaufruf der CORS-Middleware aus, wenn sie in der HTTP-Anforderung vorhanden ist.[EnableCors(...)]
.Die Anfrage ist erfolgreich, wenn kein origin
HTTP-Anfrageheader bereitgestellt wird.
.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
Das Problem wurde bei der Durchführung dieses Commits zu einer einfachen Sandbox-App gefunden: https://github.com/martincostello/api/pull/109/commits/a40a99f2dbb82d17ce6cc7cde5e13bc400d78137
cc @pranavkm
Mögliche Problemumgehungen für Preview4 sind:
1) Mit einer Middleware, die den Wert in HttpContext.Items
nach UseCors()
festlegt
```C#
app.UseCors();
app.Use((Kontext, weiter) =>
{
context.Items["__CorsMiddlewareInvoked"] = true;
Rückkehr als nächstes ();
});
2) Disable the check in `EndpointRouting`:
```C#
services.AddRouting(r => r.SuppressCheckForUnhandledSecurityMetadata = true);
Der erste wäre zu bevorzugen, da er keine Überprüfung für eine falsch konfigurierte Anwendung entfernt.
Hilfreichster Kommentar
Mögliche Problemumgehungen für Preview4 sind:
1) Mit einer Middleware, die den Wert in
HttpContext.Items
nachUseCors()
festlegt```C#
app.UseCors();
app.Use((Kontext, weiter) =>
{
context.Items["__CorsMiddlewareInvoked"] = true;
Rückkehr als nächstes ();
});
Der erste wäre zu bevorzugen, da er keine Überprüfung für eine falsch konfigurierte Anwendung entfernt.