سياسة تسمح بجلسة واحدة لكل حساب تبدو محسومة إلى أن يصل تسجيل الدخول الثاني. هناك نتيجتان ممكنتان: المستخدم الجديد يحل محل الجالس، أو يحتفظ الجالس بالفتحة ويُرفض الجديد. الثانية وحدها هي سياسة الجلسة الأولى تفوز. الخيار في العميل الذي يلجأ إليه معظم الناس يفعّل التزامن، ومن ثم لا ينتج هذه السياسة.

عقدان يختبئان خلف إعداد واحد

مع تعطيل التزامن، يمكن لاتصال ثانٍ يحمل اسم الشهادة نفسه أن يزيح الجلسة العاملة. وتشغيل التزامن يسمح بعدة جلسات في وقت واحد، وهو عكس الحد. ولا واحدة من الحالتين سياسة رفض، لذا يجب اتخاذ القرار في مكان آخر تمامًا.

اكتب العقد قبل أن تنفذ أي شيء: من يُرفض، وما الدليل الذي يحدد الجالس، وماذا يحدث عندما تموت جلسة دون قطع نظيف. سياسة لم يصرح بها أحد بهذه الصيغة لا يمكن اختبارها لاحقًا.

الإخلاء يقع قبل خطاف الاتصال

في مسار كود الخادم 2.6، يزيل الإعداد المبكر للعميل الجديد النسخ القائمة بالاسم نفسه عندما يكون التزامن معطلًا. ويحدث هذا الإزالة قبل تشغيل سلسلة معالج الاتصال. لذلك فإن سكربتًا يلاحظ التكرار ويعيد الفشل يرفض الجديد بعد أن يكون الجالس قد أُسقط بالفعل، وهو بالضبط ما كانت السياسة تريد منعه. ترتيب الاستدعاءات في تطبيق المنبع هو الجواب الوحيد الموثوق لبنائك.

StageWho can still refuseEffect on the incumbent
Certificate checkServer trust configurationNone
Authentication decisionThe authentication controllerNone, because establishment has not run
Connect handlerA profile scriptAlready evicted in the same-name case
Post-establishmentStatus tooling, monitoringBoth sessions already exist or one is gone

استطلاع ملف الحالة ليس بوابة أيضًا. محاولتان تصلان معًا يمكن أن ترى كلتاهما فتحة فارغة قبل أن تثبّت إحداهما، وتتابع الاثنتان.

انقل القرار إلى المصادقة

يمكن لواجهة الإدارة أن تتولى قرار المصادقة بعد التحقق من الشهادة. في هذا الترتيب لا يكون المتحكم مراقبًا: بل يستقبل كل نسخة عميل متصلة ويجيب هل يجوز لهذه النسخة المتابعة. ولأن الجواب يصل قبل الإنشاء، فإن الرفض يترك الجالس سليمًا. وتُبلغ القناة نفسها عن الانقطاعات، وهكذا يعرف المتحكم أن فتحة أُفرج عنها بشكل مشروع.

على كل نسخة جديدة أن تمر بهذه البوابة، بما في ذلك إعادة الاتصال وأي مسار يعيد المصادقة دون طلب. بوابة لا تصل إليها بعض النسخ لا تحمي شيئًا، ويبقى الإغفال غير مرئي حتى يجرب أحدهم التجاوز.

يمكن للرموز أن تتجاوز البوابة

بمجرد إصدار رمز، يستطيع الخادم التحقق منه داخليًا وتخطي المصادقة الخارجية لذلك الاتصال. لا يحدث نداء الإدارة أبدًا، لذا لا يرى فحص الفتحة المنفذ هناك فقط النسخة الجديدة. هذا السلوك راحة للمستخدمين وثغرة في سياسة التزامن. اجعل الاتصالات المصادق عليها بالرمز تمر بفحص مرجعي مكافئ، أو عطّل مسار الرمز عندما تتطلب السياسة قرارًا في كل اتصال.

لا تعوّض بقبول كل رمز بلا شرط. الرمز المنتهي أو غير الصالح يجب أن يفشل، وعليه أن يفشل عبر نقطة القرار نفسها ككل شيء آخر.

اربط الحجز بنسخة، لا بعنوان

العنوان هوية ضعيفة: إعادة الاتصال من الحاسوب نفسه قد تصل من عنوان مختلف، وبيانات اعتماد منسوخة قد تصل من العنوان نفسه. اربط الحجز بنسخة العميل التي يخصصها الخادم، حتى تُعرف إعادة مصادقة النسخة المقبولة سابقًا بأنها المالك. وعلى معرف النسخة الجديدة أن يحصل على فتحته عبر قرار الأول يفوز حتى لو قدّم الرمز نفسه.

لا تفرج إلا عن الحجز الذي يخص المحاولة الفاشلة. يجب ألا يمسح حدث انقطاع متأخر من محاولة أقدم فتحة مالك أحدث، ولهذا تسمّي الإفراج النسخة لا الحساب. بعد إعادة تشغيل المتحكم، طابق الجلسات الحية قبل قبول أي أحد، وطبّق القاعدة نفسها على كل بوابة تخدم الحساب.

قرر بشكل منفصل كيف تُستعاد فتحة قديمة فعلًا. يحتاج المسؤول إلى طريقة موثقة لمسحها، ويجب ألا يكون هذا المسار متاحًا لمستخدم ينقر إعادة الاتصال فقط.

اختبر الأزواج المهمة: تسجيلان شبه متزامنين، وإعادة اتصال بعد إنهاء نظيف، وإعادة مصادقة الجالس، ورفض الجديد، وإعادة تشغيل المتحكم. في كل حالة يجب أن يبقى الجالس صالحًا ويُرفض الجديد دون ضرر على حسابات أخرى.

مقالات ذات صلة