سؤال

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

هل هذا شيء أحتاج إلى تنفيذه بنفسي، أم يجب دعمه بشكل متأصل؟

ليس لدي أي تعليمات برمجية تتعامل معها على وجه التحديد (ولا يبدو أن أيًا من أعضاء الواجهة يتعامل معها على وجه التحديد)، ولكن إذا كنت بحاجة إلى تنفيذها بنفسي، فكيف يمكنني إخبار المستخدم بأنه محظور؟هل أحتاج إلى رفع نوع من الاستثناء في ValidateUser؟

حل

من العار أنني لا أستطيع وضع علامة على إجابتين، فالروابط التي قدمها Dave R تعطي نظرة متعمقة رائعة على كيفية عمل العضوية، وما أشار إليه Zhaph هو ما انتهى بي الأمر إلى فعله، وهو التعامل مع المنطق المقفل في موفر العضوية المخصص.

قمت بعد ذلك بمعالجة حالة الخطأ باستخدام حدث LoginError الخاص بعنصر التحكم في تسجيل الدخول وقمت بتسجيل الدخول هناك لمعرفة ما إذا كان المستخدم قد تم حظره من أجل إظهار رسالة الخطأ المناسبة.

هل كانت مفيدة؟

المحلول

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

http://www.asp.net/LEARN/security/tutorial-06-cs.aspx

لا توجد أيضًا طريقة مضمنة لفتح الحسابات (على سبيل المثال.عليك القيام بذلك من خلال أدوات قاعدة البيانات إذا كنت تستخدم شيئًا مشابهًا لـ SqlMembershipProvider).كتب سكوت أيضًا مقالًا حول إنشاء واجهة مستخدم لإدارة ذلك، والذي يمكنك العثور عليه هنا:

http://www.asp.net/LEARN/security/tutorial-14-vb.aspx

في الحقيقة أنصح بقراءة السلسلة بأكملها.سكوت متواصل ممتاز.

آمل أن يساعد هذا.

نصائح أخرى

هذا شيء يجب أن تكتبه بنفسك.

يحتوي مخطط قاعدة البيانات الافتراضية على الأعمدة التالية في جدول aspnet_Membership:

IsLockedOut
FailedPasswordAttemptCount
FailedPasswordAttemptWindowStart

سيتم زيادة عدد المحاولات في كل محاولة فاشلة داخل نافذة المحاولة، ويتم تخزين وقت المحاولة الفاشلة الأولى في عمود بداية النافذة، بمجرد أن يساوي FailedPasswordAttemptCount maxInvalidPasswordAttempts من التكوين، يتم تعيين IsLockedOut.

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

maxInvalidPasswordAttempts="5"
passwordAttemptWindow="10"

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

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

if (0 < Membership.MaxInvalidPasswordAttempts && Membership.MaxInvalidPasswordAttempts < 100)
       {
                for(int i = 0; i <= Membership.MaxInvalidPasswordAttempts; i++)
                {
                    Membership.ValidateUser(userName, "jfdlsjflksjlkfjsdlkfjsdl");
                }
        }

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top