Aspnetcore: CORS μ‚¬μš© μ—”λ“œ ν¬μΈνŠΈμ— λŒ€ν•œ μš”μ²­μ΄ μ˜€λ¦¬μ§„ 헀더없이 μš”μ²­ 된 경우 HTTP 500

에 λ§Œλ“  2019λ…„ 04μ›” 13일  Β·  3μ½”λ©˜νŠΈ  Β·  좜처: dotnet/aspnetcore

버그 μ„€λͺ…

origin HTTP μš”μ²­ 헀더가 μ§€μ •λ˜μ§€ μ•Šμ€ CORS μ‚¬μš© 끝점에 HTTP μš”μ²­μ΄ μˆ˜ν–‰λ˜λ©΄ HTTP 500 였λ₯˜μ™€ ν•¨κ»˜ μš”μ²­μ΄ μ‹€νŒ¨ν•©λ‹ˆλ‹€.

둜그의 μ˜ˆμ™ΈλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

[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() _has_이 (κ°€) 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

두 가지 κ°€λŠ₯ν•œ μˆ˜μ • 사항은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  1. CORS λ―Έλ“€μ›¨μ–΄λŠ” 항상 "I 've run"값을 HttpContext.Items 에 μΆ”κ°€ν•©λ‹ˆλ‹€. λ˜λŠ” :
  2. μ—”λ“œ 포인트 미듀웨어 _also_λŠ” CORS 메타 데이터가 μ—”λ“œ ν¬μΈνŠΈμ—μžˆλŠ” 경우 origin 헀더λ₯Ό ν™•μΈν•˜κ³  HTTP μš”μ²­μ—μžˆλŠ” 경우 CORS λ―Έλ“€μ›¨μ–΄μ˜ λΉ„ ν˜ΈμΆœμ— λŒ€ν•œ μ˜ˆμ™Έ 만 λ°œμƒν•©λ‹ˆλ‹€.

μž¬ν˜„ν•˜λ €λ©΄

  1. CORSλ₯Ό μ‚¬μš©ν•˜λ„λ‘ ASP.NET Core MVC μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ΅¬μ„±ν•©λ‹ˆλ‹€.
  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.Items [ "__ CorsMiddlewareInvoked"] = true;
return next ();
});


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

첫 λ²ˆμ§ΈλŠ” 잘λͺ» κ΅¬μ„±λœ μ‘μš© ν”„λ‘œκ·Έλž¨μ— λŒ€ν•œ 검사λ₯Ό μ œκ±°ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ„ ν˜Έλ©λ‹ˆλ‹€.

λͺ¨λ“  3 λŒ“κΈ€

κ°„λ‹¨ν•œ μƒŒλ“œ λ°•μŠ€ 앱에 λŒ€ν•œμ΄ 컀밋을 λ§Œλ“œλŠ” κ³Όμ •μ—μ„œ λ¬Έμ œκ°€ λ°œκ²¬λ˜μ—ˆμŠ΅λ‹ˆλ‹€. https://github.com/martincostello/api/pull/109/commits/a40a99f2dbb82d17ce6cc7cde5e13bc400d78137

cc @pranavkm

preview4의 경우 κ°€λŠ₯ν•œ ν•΄κ²° 방법은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

1) 미듀웨어λ₯Ό κ°–λŠ” μ„ΈνŠΈμ˜ κ°’ HttpContext.Items ν›„ UseCors()

```C #
app.UseCors ();

app.Use ((λ¬Έλ§₯, λ‹€μŒ) =>
{
context.Items [ "__ CorsMiddlewareInvoked"] = true;
return next ();
});


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

첫 λ²ˆμ§ΈλŠ” 잘λͺ» κ΅¬μ„±λœ μ‘μš© ν”„λ‘œκ·Έλž¨μ— λŒ€ν•œ 검사λ₯Ό μ œκ±°ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ„ ν˜Έλ©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰