Aspnetcore: HTTP 500 إذا تم طلب نقطة نهاية ممكّنة لـ CORS بدون رأس أصل

تم إنشاؤها على ١٣ أبريل ٢٠١٩  ·  3تعليقات  ·  مصدر: dotnet/aspnetcore

صف الخلل

إذا تم إجراء طلب HTTP لنقطة نهاية تم تمكين CORS فيها حيث لم يتم تحديد رأس طلب HTTP origin ، يفشل الطلب مع ظهور خطأ 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() _ إلى التطبيق قبل app.UseEndpoints(...) .

يبدو أن هذا تم تقديمه بواسطة # 9181.

إذا كان الطلب لا يحتوي على رأس طلب origin ، فسيتم تخطي CORS الوسيطة:

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

ومع ذلك ، تعثر البرمجية الوسيطة لنقطة النهاية على البيانات الوصفية لـ CORS في نقطة النهاية التي يتم استدعاؤها ، وتتحقق مما إذا كان قد تم استدعاء برمجية CORS الوسيطة (التي تم استدعاؤها ، ولكن تم تخطيها لعدم الحاجة إليها) من خلال البحث عن مفتاح في HttpContext 's العناصر. العنصر غير موجود ، لذلك تم طرح استثناء:

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 الوسيطة دائمًا قيمة "لقد قمت بتشغيل" إلى HttpContext.Items ، أو:
  2. يتحقق البرنامج الوسيط لنقطة النهاية _also_ من رأس origin إذا كانت بيانات CORS الأولية موجودة في نقطة النهاية ، ولا يطرح سوى استثناء لعدم استدعاء برمجية CORS الوسيطة إذا كان موجودًا في طلب HTTP.

لإعادة إنتاج

  1. تكوين تطبيق ASP.NET Core MVC لاستخدام CORS.
  2. أضف السمة [EnableCors(...)] إلى طريقة تحكم.
  3. بدء تطبيق.
  4. قم بتنفيذ طلب HTTP قياسي (على سبيل المثال باستخدام cURL) إلى نقطة النهاية.

سلوك متوقع

ينجح الطلب إذا لم يتم توفير عنوان طلب HTTP origin .

سياق إضافي

.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

التعليق الأكثر فائدة

للمعاينة 4 ، تشمل الحلول الممكنة ما يلي:

1) امتلاك برمجية وسيطة تحدد القيمة بـ HttpContext.Items بعد UseCors()

ج #
app.UseCors () ،

app.Use ((سياق ، التالي) =>
{
Context.Items ["__ CorsMiddlewareInvoked"] = صحيح ؛
العودة التالية () ؛
}) ؛


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

يُفضل الخيار الأول نظرًا لأنه لا يزيل فحصًا لأحد التطبيقات التي تمت تهيئتها بشكل خاطئ.

ال 3 كومينتر

تم العثور على المشكلة كجزء من الالتزام بتطبيق وضع الحماية البسيط: https://github.com/martincostello/api/pull/109/commits/a40a99f2dbb82d17ce6cc7cde5e13bc400d78137

سي سي برانافكم

للمعاينة 4 ، تشمل الحلول الممكنة ما يلي:

1) امتلاك برمجية وسيطة تحدد القيمة بـ HttpContext.Items بعد UseCors()

ج #
app.UseCors () ،

app.Use ((سياق ، التالي) =>
{
Context.Items ["__ CorsMiddlewareInvoked"] = صحيح ؛
العودة التالية () ؛
}) ؛


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

يُفضل الخيار الأول نظرًا لأنه لا يزيل فحصًا لأحد التطبيقات التي تمت تهيئتها بشكل خاطئ.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات