إذا تم إجراء طلب 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 الوسيطة:
ومع ذلك ، تعثر البرمجية الوسيطة لنقطة النهاية على البيانات الوصفية لـ CORS في نقطة النهاية التي يتم استدعاؤها ، وتتحقق مما إذا كان قد تم استدعاء برمجية CORS الوسيطة (التي تم استدعاؤها ، ولكن تم تخطيها لعدم الحاجة إليها) من خلال البحث عن مفتاح في HttpContext
's العناصر. العنصر غير موجود ، لذلك تم طرح استثناء:
المفتاح الذي يتم اختباره بواسطة البرنامج الوسيط لنقطة النهاية يُضاف فقط إذا كان رأس origin
موجودًا في الطلب ، وهو هنا:
يبدو أن هناك إصلاحان محتملان هما:
HttpContext.Items
، أو:origin
إذا كانت بيانات CORS الأولية موجودة في نقطة النهاية ، ولا يطرح سوى استثناء لعدم استدعاء برمجية CORS الوسيطة إذا كان موجودًا في طلب HTTP.[EnableCors(...)]
إلى طريقة تحكم.ينجح الطلب إذا لم يتم توفير عنوان طلب 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
تم العثور على المشكلة كجزء من الالتزام بتطبيق وضع الحماية البسيط: 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);
يُفضل الخيار الأول نظرًا لأنه لا يزيل فحصًا لأحد التطبيقات التي تمت تهيئتها بشكل خاطئ.
التعليق الأكثر فائدة
للمعاينة 4 ، تشمل الحلول الممكنة ما يلي:
1) امتلاك برمجية وسيطة تحدد القيمة بـ
HttpContext.Items
بعدUseCors()
ج #
app.UseCors () ،
app.Use ((سياق ، التالي) =>
{
Context.Items ["__ CorsMiddlewareInvoked"] = صحيح ؛
العودة التالية () ؛
}) ؛
يُفضل الخيار الأول نظرًا لأنه لا يزيل فحصًا لأحد التطبيقات التي تمت تهيئتها بشكل خاطئ.