Aspnetcore: CORS対応エンドポイントへのリクエストがオリジンヘッダーなしでリクエストされた場合はHTTP500

作成日 2019年04月13日  ·  3コメント  ·  ソース: dotnet/aspnetcore

バグを説明する

origin HTTPリクエストヘッダーが指定されていないCORS対応エンドポイントに対してHTTPリクエストが行われると、リクエストはHTTP500エラーで失敗します。

ログの例外は次のとおりです。

[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()は、 app.UseEndpoints(...)前にアプリケーションに追加されています。

これは#9181によって導入されたようです。

リクエストにoriginリクエストヘッダーがない場合、CORSミドルウェアはスキップされます。

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

ただし、エンドポイントミドルウェアは、呼び出されているエンドポイントでCORSメタデータを検出し、 HttpContextのキーを探すことで、CORSミドルウェアが呼び出されたかどうかを確認します(呼び出されたが、不要なためスキップされた)。アイテム。 アイテムが存在しないため、例外がスローされます。

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

エンドポイントミドルウェアによってテストされているキーは、 originヘッダーがリクエストに存在する場合にのみ追加されます。これは次のとおりです。

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

2つの可能な修正は次のいずれかであるように思われます。

  1. CORSミドルウェアは、常に「実行した」値をHttpContext.Itemsに追加します。または:
  2. エンドポイントミドルウェアは、CORSメタデータがエンドポイントに存在する場合にoriginヘッダーをチェックし、HTTPリクエストに存在する場合にのみCORSミドルウェアの非呼び出しの例外をスローします。

再現するには

  1. CORSを使用するようにASP.NETCoreMVCアプリケーションを構成します。
  2. [EnableCors(...)]属性をコントローラーメソッドに追加します。
  3. アプリケーションを起動します。
  4. エンドポイントに対して標準のHTTPリクエスト(cURLなど)を実行します。

予想される行動

origin HTTPリクエストヘッダーが指定されていない場合、リクエストは成功します。

追加のコンテキスト

.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

最も参考になるコメント

Preview4の場合、考えられる回避策は次のとおりです。

1)で値を設定するミドルウェア持つHttpContext.Itemsの後にUseCors()

```C#
app.UseCors();

app.Use((context、next)=>
{{
context.Items ["__ CorsMiddlewareInvoked"] = true;
next();を返す
});


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

最初のものは、誤って構成されたアプリケーションのチェックを削除しないため、推奨されます。

全てのコメント3件

単純なサンドボックスアプリへのこのコミットの一部として問題が見つかりました: https

cc @pranavkm

Preview4の場合、考えられる回避策は次のとおりです。

1)で値を設定するミドルウェア持つHttpContext.Itemsの後にUseCors()

```C#
app.UseCors();

app.Use((context、next)=>
{{
context.Items ["__ CorsMiddlewareInvoked"] = true;
next();を返す
});


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

最初のものは、誤って構成されたアプリケーションのチェックを削除しないため、推奨されます。

このページは役に立ちましたか?
0 / 5 - 0 評価