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

سيتلقى .NET تحديثات لتغيير سلوك سمة SameSite في .NET 4.7.2 و .NET Core 2.1 والإصدارات الأحدث للتكيف مع مقدمة Google للقيمة الجديدة. ستتوفر تحديثات .NET Framework في 19 نوفمبر كتحديث إضافي من خلال Microsoft Update و WSUS إذا كنت تستخدم ميزة التحقق من وجود تحديثات. في 10 ديسمبر ، سيصبح التحديث متاحًا للجمهور وسيظهر في مركز Microsoft Update. ستتوفر تحديثات .NET Core في نوفمبر مع إصدار .NET Core 3.1 ، بدءًا من Preview 1.
سيتضمن .NET Core 3.1
تعريف التعداد المحدّث ، SameSite.Unspecified ، والذي لن يقوم بتعيين خاصية SameSite.
سيتم تحديث OpenIdConnect الوسيطة لـ 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) {
ثم قم بتكوين إعدادات OpenIdConnect لاستخدام CookieManager الجديد ؛
app.UseOpenIdConnectAuthentication( new OpenIdConnectAuthenticationOptions {
لكي يعمل SystemWebCookieManager بشكل صحيح ، ستحتاج إلى تثبيت SameSite .NET 4.7.2 أو أحدث.
بالنسبة لـ 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();
عند الاختبار مع فريق Azure Active Directory ، وجدنا أن الاختبارات التالية تعمل لجميع وكلاء المستخدم المشتركين ، وفقًا لـ Azure Active Directory ، لا يفهمون القيمة الجديدة.
public static bool DisallowsSameSiteNone(string userAgent) {
قائمة المستعرضات هذه ليست بأي حال من الأحوال شيئًا يمكنك الاعتماد عليه بالكامل ، ويجب عليك التحقق من أن المتصفحات العادية ووكلاء المستخدم الآخرين المدعومين من قِبل النظام لديك يتصرفون بشكل صحيح بعد تثبيت التحديث.
من المقرر
أن ينتقل Chrome 80
إلى سلوك جديد في فبراير أو مارس 2020. إذا كنت تريد التحقق من السلوك الجديد ، فإن الإصدارات الأقدم من Chromium
متاحة للتنزيل .
إذا لم تتمكن من ترقية إصدار إطارك بحلول الوقت الذي يمكّن فيه Chrome السلوك الجديد في أوائل عام 2020 ، فقد تتمكن من تغيير دفق OpenIdConnect إلى دفق Code ، وليس إلى دفق يستخدمه ASP.NET و ASP.NET Core. ولكن هذا يجب أن ينظر إليه كإجراء مؤقت.
نوصي بشدة بتنزيل الإصدارات المحدثة من .NET Framework و .NET Core عندما تصبح متوفرة في نوفمبر وبدء التخطيط للتحديث قبل إجراء التغييرات على Chrome.