إنتقل إلى المحتوى الرئيسي

مصادقة العاملين (2FA)

يمكن حماية الحسابات باستخدام كلمة مرور لمرة واحدة قائمة على الوقت (TOTP) مصادقة عاملة بالإضافة إلى كلمة المرور. إنها اختيارية من ملف تعريف المستخدم افتراضيًا، ويمكن لنشر الملصق الأبيض جعله إلزاميًا للجميع. تعمل أي تطبيق مصادق RFC 6238 — Google Authenticator و Microsoft Authenticator و Authy و Aegis و FreeOTP — لأن التنفيذ معياري (SHA-1 و 6 أرقام و 30 ثانية الخطوة)؛ لا يتم تضمين أي مكون خادم ملكي.

كيف يعمل​

  • المجال. يعيش MFA على AppUser aggregate (السياق Access). يتم تسجيل المستخدم من خلال أساليب تكشف النية — BeginMfaEnrollment وConfirmMfaEnrollment وConsumeBackupCode و RegenerateBackupCodes وDisableMfa — لذلك يتم فرض الثوابت (يجب التأكيد من السر قبل تفعيله؛ يتم استخدام رمز احتياطي لمرة واحدة فقط) في مكان واحد.
  • TOTP. الإنشاء والتحقق يجلسان خلف Core ITotpAuthenticator واجهة، التي تنفذها البنية الأساسية باستخدام Otp.NET library. التحقق يتسامح ±1 خطوة زمنية من انجراف الساعة.
  • السر في الراحة. يتم تخزين السر المصادق مشفر عبر ISecretProtector (EncryptionPurposes.MfaSecret) — أبدًا في نص عادي.
  • الرموز الاحتياطية. يتم إصدار عشرة رموز استرجاع لمرة واحدة عند التسجيل، معروضة مرة واحدة فقط، ومخزنة فقط كـ SHA-256 hashes (MfaBackupCodes). كل واحد يعمل بالضبط مرة واحدة؛ يتم رفض الرمز المستخدم بعد ذلك.

تمكينها (الملف الشخصي)​

على صفحة الحساب (/account) يعرض قسم المصادقة ثنائية العاملين الحالة الحالية:

  1. تفعيل عاملين يفتح حوار MudBlazor مع رمز QR (يتم عرضه من جانب الخادم كـ SVG عبر Net.Codecrete.QrCodeGenerator) بالإضافة إلى مفتاح الإعداد اليدوي.
  2. قم بمسح الضوئي له وأدخل رمز 6 أرقام للتأكيد — يتحقق هذا من السر المعلق قبل التفعيل.
  3. يعرض الحوار بعد ذلك الرموز الاحتياطية؛ احفظهم. 2FA على الآن.

نفس القسم يسمح للمستخدم المسجل إعادة توليد الرموز الاحتياطية أو الإيقاف 2FA — كلاهما يتطلب كلمة مرور الحساب للتأكيد.

التوقيع مع 2FA​

يكون تسجيل الدخول ذو خطوتين يتدفق مرة واحدة تم تفعيل 2FA:

  1. خطوة كلمة المرور (POST /api/auth/login). بنجاح ملف تعريف الارتباط للمصادقة ليس مرسل بعد؛ بدلاً من ذلك أ قصيرة الأجل (5 دقائق)، ملف تعريف ارتباط معلق مشفر يتم تعيينه والمستخدم يتم إرساله إلى /login/2fa.
  2. خطوة التحدي (POST /api/auth/login/verify-2fa). يدخل المستخدم رمز TOTP أو أي رمز احتياطي غير مستخدم. بنجاح يتم إسقاط ملف تعريف الارتباط المعلق وإصدار ملف تعريف الارتباط الحقيقي للمصادقة.

محاولات العاملين الثانيين الفاشلة تحسب نحو حساب القفل الموجود (AuthLockout)، و نقاط نهاية المصادقة محدودة بالسعر.

2FA إلزامي لنشر الملصق الأبيض​

يمكن لموزع منظم طلب 2FA لكل حساب**:

// appsettings / البيئة
"App": { "Branding": { "RequireMfa": true } } // App__Branding__RequireMfa=true

عندما يكون RequireMfa على ومستخدم بدون 2FA يسجل دخول، تقرير خطوة كلمة المرور mfaSetupRequired وMfaEnforcementMiddleware تحول مسارات صفحتهم إلى /account حتى ينهي التسجيل. الافتراضي false، لذلك نشر غير مشفر يحافظ على 2FA اختياري. انظر Markup-label.

نقاط النهاية​

الطريقة والمسارالغرض
POST /api/auth/loginخطوة كلمة المرور؛ يعود mfaRequired (تحدي) أو يسجل الدخول
POST /api/auth/login/verify-2faخطوة العاملين الثانيين (TOTP أو رمز احتياطي)
GET /api/auth/mfa/statusMfaEnabled ومعلق وحساب رمز احتياطي المتبقية
POST /api/auth/mfa/setupابدأ التسجيل — يعود السر وotpauth:// URI و QR SVG
POST /api/auth/mfa/confirmتأكيد الرمز وتفعيل وعودة الرموز الاحتياطية
POST /api/auth/mfa/disableالتوقيف (تأكيد كلمة المرور)
POST /api/auth/mfa/backup-codes/regenerateإصدار مجموعة جديدة (تأكيد كلمة المرور)

الاختبارات​

  • الوحدة — UnitTests/Access/OtpNetTotpAuthenticatorTests.cs (RFC 6238 vectors)، AppUserMfaTests.cs (ثوابت التسجيل/الانتقال/لمرة واحدة)، MfaBackupCodesTests.cs.
  • التكامل — IntegrationTests/MfaPersistenceTests.cs (تسجيل → تأكيد → استهلاك وحذف متسلسل) وMfaFlowTests.cs (تسجيل دخول كامل HTTP ذو خطوتين مع TOTP + رمز احتياطي وبوابة التسجيل الإلزامي).
  • E2E — E2ETests/MfaFlowTests.cs: تمكين من الملف الشخصي (QR + تأكيد + رموز احتياطية) وإكمال تسجيل دخول مطالب، على عرض المكتب والهاتف المحمول.