Aspnetcore: HTTP 500, wenn eine Anfrage an einen CORS-fähigen Endpunkt ohne Ursprungsheader angefordert wird

Erstellt am 13. Apr. 2019  ·  3Kommentare  ·  Quelle: dotnet/aspnetcore

Beschreibe den Fehler

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:

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

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:

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

Der von der Endpunkt-Middleware getestete Schlüssel wird nur hinzugefügt, wenn der Header origin in der Anfrage vorhanden ist, die hier ist:

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

Es scheint, dass zwei mögliche Korrekturen entweder sind:

  1. Die CORS-Middleware fügt immer den Wert "I've run" zu HttpContext.Items , oder:
  2. Die Endpunkt-Middleware überprüft _auch_ den 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.

Fortpflanzen

  1. Konfigurieren Sie eine ASP.NET Core MVC-Anwendung für die Verwendung von CORS.
  2. Fügen Sie einer Controller-Methode das Attribut [EnableCors(...)] .
  3. Anwendung starten.
  4. Führen Sie eine Standard-HTTP-Anfrage (zB mit cURL) an den Endpunkt durch.

Erwartetes Verhalten

Die Anfrage ist erfolgreich, wenn kein origin HTTP-Anfrageheader bereitgestellt wird.

Zusätzlicher Kontext

.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

Hilfreichster Kommentar

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.

Alle 3 Kommentare

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.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen