مصادقة العاملين (2FA)
يمكن حماية الحسابات باستخدام كلمة مرور لمرة واحدة قائمة على الوقت (TOTP) مصادقة عاملة بالإضافة إلى كلمة المرور. إنها اختيارية من ملف تعريف المستخدم افتراضيًا، ويمكن لنشر الملصق الأبيض جعله إلزاميًا للجميع. تعمل أي تطبيق مصادق RFC 6238 — Google Authenticator و Microsoft Authenticator و Authy و Aegis و FreeOTP — لأن التنفيذ معياري (SHA-1 و 6 أرقام و 30 ثانية الخطوة)؛ لا يتم تضمين أي مكون خادم ملكي.
كيف يعمل
- المجال. يعيش MFA على
AppUseraggregate (السياق Access). يتم تسجيل المستخدم من خلال أساليب تكشف النية —BeginMfaEnrollmentوConfirmMfaEnrollmentوConsumeBackupCodeوRegenerateBackupCodesوDisableMfa— لذلك يتم فرض الثوابت (يجب التأكيد من السر قبل تفعيله؛ يتم استخدام رمز احتياطي لمرة واحدة فقط) في مكان واحد. - TOTP. الإنشاء والتحقق يجلسان خلف Core
ITotpAuthenticatorواجهة، التي تنفذها البنية الأساسية باستخدام Otp.NET library. التحقق يتسامح ±1 خطوة زمنية من انجراف الساعة. - السر في الراحة. يتم تخزين السر المصادق مشفر عبر
ISecretProtector(EncryptionPurposes.MfaSecret) — أبدًا في نص عادي. - الرموز الاحتياطية. يتم إصدار عشرة رموز استرجاع لمرة واحدة عند التسجيل، معروضة مرة واحدة فقط، ومخزنة فقط
كـ SHA-256 hashes (
MfaBackupCodes). كل واحد يعمل بالضبط مرة واحدة؛ يتم رفض الرمز المستخدم بعد ذلك.
تمكينها (الملف الشخصي)
على صفحة الحساب (/account) يعرض قسم المصادقة ثنائية العاملين الحالة الحالية:
- تفعيل عاملين يفتح حوار MudBlazor مع رمز QR (يتم عرضه من جانب الخادم كـ SVG عبر
Net.Codecrete.QrCodeGenerator) بالإضافة إلى مفتاح الإعداد اليدوي. - قم بمسح الضوئي له وأدخل رمز 6 أرقام للتأكيد — يتحقق هذا من السر المعلق قبل التفعيل.
- يعرض الحوار بعد ذلك الرموز الاحتياطية؛ احفظهم. 2FA على الآن.
نفس القسم يسمح للمستخدم المسجل إعادة توليد الرموز الاحتياطية أو الإيقاف 2FA — كلاهما يتطلب كلمة مرور الحساب للتأكيد.
التوقيع مع 2FA
يكون تسجيل الدخول ذو خطوتين يتدفق مرة واحدة تم تفعيل 2FA:
- خطوة كلمة المرور (
POST /api/auth/login). بنجاح ملف تعريف الارتباط للمصادقة ليس مرسل بعد؛ بدلاً من ذلك أ قصيرة الأجل (5 دقائق)، ملف تعريف ارتباط معلق مشفر يتم تعيينه والمستخدم يتم إرساله إلى/login/2fa. - خطوة التحدي (
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/status | MfaEnabled ومعلق وحساب رمز احتياطي المتبقية |
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 + تأكيد + رموز احتياطية) وإكمال تسجيل دخول مطالب، على عرض المكتب والهاتف المحمول.