SameSite هو
امتداد 2016
لملفات تعريف الارتباط HTTP يهدف إلى التخفيف من تزوير طلب الموقع المتقاطع (CSRF). كان التصميم الأصلي ميزة تمكين يمكن استخدامها عن طريق إضافة خاصية SameSite جديدة إلى ملفات تعريف الارتباط. كان لها قيمتان ، لاكس و ستريكت.
يشير تعيين القيمة إلى Lax إلى أنه يجب إرسال ملف تعريف الارتباط في التنقل داخل نفس الموقع ، أو من خلال GET navigation إلى موقعك من مواقع أخرى. تقتصر قيمة Strict على ملف تعريف الارتباط على الطلبات التي نشأت فقط من نفس الموقع. لا يؤدي وضع الخاصية على الإطلاق إلى وضع قيود على كيفية تدفق ملف تعريف الارتباط في الطلبات. يمكن لعمليات مصادقة OpenIdConnect (مثل تسجيل الدخول والخروج) والميزات الأخرى التي ترسل طلبات POST من موقع خارجي إلى الموقع الذي يطلب العملية ، استخدام ملفات تعريف الارتباط من أجل الارتباط و / أو حماية CSRF. ستحتاج هذه العمليات إلى إلغاء الاشتراك من SameSite ، من خلال عدم تعيين الخاصية على الإطلاق ، لضمان إرسال ملفات تعريف الارتباط هذه أثناء تدفق الطلبات المتخصصة.
تعمل Google الآن على
تحديث المعيار وتنفيذ التغييرات المقترحة في إصدار قادم من Chrome. يضيف التغيير قيمة SameSite جديدة ، "بلا" ، ويغير السلوك الافتراضي إلى "Lax". يؤدي هذا إلى فواصل تسجيلات OpenIdConnect ، والميزات الأخرى التي قد يعتمد عليها موقع الويب الخاص بك ، وسيتعين على هذه الميزات استخدام ملفات تعريف الارتباط التي تم تعيين خاصية SameSite لها على قيمة "بلا".
ومع ذلك ، فإن المتصفحات التي تلتزم بالمعيار الأصلي وغير مدركة للقيمة الجديدة يكون لها سلوك مختلف للمتصفحات التي تستخدم المعيار الجديد حيث ينص معيار SameSite على أنه إذا رأى المستعرض قيمة لـ SameSite ، فإنه لا يفهم أنه يجب أن يعامل تلك القيمة على أنها «صارمة». هذا يعني أن موقع الويب الخاص بك على .NET سيضطر الآن إلى إضافة استنشاق وكيل مستخدم لتقرير ما إذا كنت سترسل قيمة بلا جديدة أم لا ترسل السمة على الإطلاق.

سيصدر .NET تحديثات لتغيير سلوك سلوك سمة SameSite الخاص به في .NET 4.7.2 وفي .NET Core 2.1 وما بعده لتعكس مقدمة Google لقيمة جديدة. ستتوفر تحديثات .NET Framework في 19 نوفمبر كتحديث اختياري عبر Microsoft Update و WSUS إذا كنت تستخدم وظيفة "التحقق من وجود تحديث". في العاشر من كانون الأول (ديسمبر) ، سيصبح متاحًا على نطاق واسع وسيظهر في Microsoft Update دون الحاجة إلى البحث عن التحديثات على وجه التحديد. ستتوفر تحديثات .NET Core مع .NET Core 3.1 بدءًا من المعاينة 1 ، في نوفمبر.
سيحتوي .NET Core 3.1 على
تعريف التعداد المحدّث ، SameSite.Unspecified والذي لن يقوم بتعيين خاصية SameSite.
سيتم تحديث البرنامج الوسيط OpenIdConnect for Microsoft.Owin v4.1 و .NET Core في نفس الوقت الذي يتم فيه تحديث .NET Framework و. NET ، ومع ذلك لا يمكننا إدخال كود استنشاق وكيل المستخدم في الإطار ، يجب تنفيذ ذلك في رمز الموقع. يختلف تطبيق استنشاق الوكيل وفقًا لإصدار ASP.NET أو ASP.NET Core الذي تستخدمه والمتصفحات التي ترغب في دعمها.
ل ASP.NET 4.7.2 مع Microsoft.Owin 4.1.0 يمكن استنشاق عامل شم باستخدام
ICookieManager ؛
public class SameSiteCookieManager : ICookieManager { private readonly ICookieManager _innerManager; public SameSiteCookieManager() : this(new CookieManager()) { } public SameSiteCookieManager(ICookieManager innerManager) { _innerManager = innerManager; } public void AppendResponseCookie(IOwinContext context, string key, string value, CookieOptions options) { CheckSameSite(context, options); _innerManager.AppendResponseCookie(context, key, value, options); } public void DeleteCookie(IOwinContext context, string key, CookieOptions options) { CheckSameSite(context, options); _innerManager.DeleteCookie(context, key, options); } public string GetRequestCookie(IOwinContext context, string key) { return _innerManager.GetRequestCookie(context, key); } private void CheckSameSite(IOwinContext context, CookieOptions options) { if (DisallowsSameSiteNone(context) && options.SameSite == SameSiteMode.None) { options.SameSite = null; } } public static bool DisallowsSameSiteNone(IOwinContext context) { // TODO: Use your User Agent library of choice here. var userAgent = context.Request.Headers["User-Agent"]; return userAgent.Contains("BrokenUserAgent") || userAgent.Contains("BrokenUserAgent2") } }
ثم قم بتكوين إعدادات OpenIdConnect لاستخدام CookieManager الجديد ؛
app.UseOpenIdConnectAuthentication( new OpenIdConnectAuthenticationOptions { // … Your preexisting options … CookieManager = new SameSiteCookieManager(new SystemWebCookieManager()) });
سيحتاج SystemWebCookieManager إلى .NET 4.7.2 أو إصدار أحدث من تصحيح SameSite مثبت للعمل بشكل صحيح.
بالنسبة لـ ASP.NET Core ، يجب عليك تثبيت التصحيحات ثم تنفيذ كود استنشاق الوكيل داخل
سياسة ملفات تعريف الارتباط . بالنسبة للإصدارات السابقة لـ 3.1 ، استبدل SameSiteMode.Unspecified بـ (SameSiteMode) (- 1).
private void CheckSameSite(HttpContext httpContext, CookieOptions options) { if (options.SameSite > SameSiteMode.Unspecified) { var userAgent = httpContext.Request.Headers["User-Agent"].ToString(); // TODO: Use your User Agent library of choice here. if (/* UserAgent doesn't support new behavior */) { // For .NET Core < 3.1 set SameSite = -1 options.SameSite = SameSiteMode.Unspecified; } } } public void ConfigureServices(IServiceCollection services) { services.Configure<CookiePolicyOptions>(options => { options.MinimumSameSitePolicy = SameSiteMode.Unspecified; options.OnAppendCookie = cookieContext => CheckSameSite(cookieContext.Context, cookieContext.CookieOptions); options.OnDeleteCookie = cookieContext => CheckSameSite(cookieContext.Context, cookieContext.CookieOptions); }); } public void Configure(IApplicationBuilder app) { app.UseCookiePolicy(); // Before UseAuthentication or anything else that writes cookies. app.UseAuthentication(); // … }
تحت الاختبار مع فريق Azure Active Directory ، وجدنا أن الاختبارات التالية تعمل لجميع وكلاء المستخدم المشتركين الذين يرى Azure Active Directory أنهم لا يفهمون القيمة الجديدة.
public static bool DisallowsSameSiteNone(string userAgent) { // Cover all iOS based browsers here. This includes: // - Safari on iOS 12 for iPhone, iPod Touch, iPad // - WkWebview on iOS 12 for iPhone, iPod Touch, iPad // - Chrome on iOS 12 for iPhone, iPod Touch, iPad // All of which are broken by SameSite=None, because they use the iOS networking stack if (userAgent.Contains("CPU iPhone OS 12") || userAgent.Contains("iPad; CPU OS 12")) { return true; } // Cover Mac OS X based browsers that use the Mac OS networking stack. This includes: // - Safari on Mac OS X. // This does not include: // - Chrome on Mac OS X // Because they do not use the Mac OS networking stack. if (userAgent.Contains("Macintosh; Intel Mac OS X 10_14") && userAgent.Contains("Version/") && userAgent.Contains("Safari")) { return true; } // Cover Chrome 50-69, because some versions are broken by SameSite=None, // and none in this range require it. // Note: this covers some pre-Chromium Edge versions, // but pre-Chromium Edge does not require SameSite=None. if (userAgent.Contains("Chrome/5") || userAgent.Contains("Chrome/6")) { return true; } return false; }
ليست قائمة المستعرضات هذه قائمة بأي حال من الأحوال ويجب عليك التحقق من أن المتصفحات الشائعة ووكلاء المستخدم الآخرين الذين يدعمهم نظامك يتصرفون كما هو متوقع بمجرد أن يتم التحديث.
من المقرر أن يعمل Chrome 80
على تشغيل السلوك الجديد في فبراير أو مارس 2020 ، بما في ذلك تخفيف مؤقت تم إضافته في Chrome 79 Beta. إذا كنت ترغب في اختبار السلوك الجديد دون تخفيف ، فاستخدم Chromium 76. تتوفر الإصدارات الأقدم من Chromium
للتنزيل .
إذا لم تتمكن من تحديث إصدارات إطارك بحلول الوقت الذي يدير فيه Chrome السلوك الجديد في أوائل عام 2020 ، فقد تتمكن من تغيير تدفق OpenIdConnect إلى تدفق Code ، بدلاً من التدفق الضمني الافتراضي الذي يستخدمه ASP.NET و ASP.NET Core ، ولكن يجب أن ينظر إلى هذا كإجراء مؤقت.
نحن نشجعك بشدة على تنزيل إصدارات .NET Framework و .NET Core المحدثة عندما تصبح متوفرة في نوفمبر والبدء في التخطيط للتحديث الخاص بك قبل نشر تغييرات Chrome.