ملخص: يوفر مكون العضوية في asp.net 2.0 مجموعة من الواجهات البسيطة جدًا وسهلة الاستخدام للمطورين لإجراء إدارة المستخدم والتحقق من المستخدم. ستحلل هذه المقالة بإيجاز مبدأ تنفيذها، وتقدم كيفية استخدامها بشكل صحيح، وكيفية توسيعها.
1. فئة مجردة MembershipProvider
في كثير من الحالات، لا نستخدم هذه الفئة مباشرة عند استخدام العضوية. تحدد فئة MembershipProvider بعض الأساليب المجردة والسمات المجردة. وهذه الأساليب والسمات هي التي تشكل المواصفات الأساسية لواجهة العضوية، ويتم استدعاء جميع وظائف استخدام العضوية ضمن إطار عمل .NET من خلال هذا النوع. توفر الفئات الموروثة وظائف إدارة المستخدم في بيئات مختلفة من خلال تنفيذ هذه الواجهات، وليس لها أي تأثير على إطار عمل العضوية نفسه، فلنلقي نظرة على تعريف النموذج الأولي لـ MembershipProvider:
public Abstract class MembershipProvider : ProviderBase
...{
// الأحداث
الحدث العام MembershipValidatePasswordEventHandler ValidatingPassword;
// الأساليب
المحمية MembershipProvider();
public
Abstract bool ChangePassword(string username, string oldPassword, string newPassword)
;
كلمة المرور، سلسلة البريد الإلكتروني، سؤال كلمة المرور، سلسلةكلمة
المرور، تمت الموافقة على bool، موفر الكائنUserKey، حالة MembershipCreateStatus
)
؛
(سلسلة تمرير، تنسيق كلمة المرور، سلسلة الملح)؛
البايت الظاهري المحمي[] EncryptPassword(byte[] كلمة المرور
)
;
، int pageIndex، int pageSize، out int TotalRecords)؛
سلسلة داخلية GenerateSalt()؛
الملخص العام MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int
public
Abstract int GetNumberOfUsersOnline();
إجابة)؛
MembershipUser GetUser(object ProviderUserKey, bool
userIsOnline
)
;
OnValidatingPassword(ValidatePasswordEventArgs e);
سلسلة مجردة عامة ResetPassword(string username, string
Answer
)
;
الملخص المنطقي العام ValidateUser(اسم مستخدم السلسلة، كلمة مرور السلسلة)؛
// الخصائص
سلسلة مجردة اسم التطبيق ...{ get
; } bool public Abstract EnablePasswordReset ...
{
get
; الملخص int MinRequiredNonAlphanumericCharacters ...{ get }
الملخص العام int MinRequiredPasswordLength ...{ get }
الملخص العام int كلمة المرورAttemptWindow ...{ get }
الملخص العام MembershipPasswordFormat ...{ get }
سلسلة الملخص العام كلمة المرورStrengthRegularExpression ... { get }
يتطلب bool الملخص العام ...{ get }
bool الملخص العام RequiresUniqueEmail ...{ get }
// الحقول
Private
MembershipValidatePasswordEventHandler _EventHandler
;
المعدل الداخلي عبارة عن عدة طرق تعتبر طرقًا مساعدة لكلمات المرور، وتستخدم لتشفير كلمات المرور وفك تشفيرها والتحقق منها. ولكن يبدو أن هناك بعض المشاكل في التصميم هنا، ويبدو من غير المناسب بعض الشيء تعريف هذه الأساليب كنطاق داخلي. يتم تعريف هذه الأساليب في الفئة الأساسية بحيث يمكن إعادة استخدامها، ولكن من وجهة نظر التأثير ليس الأمر كذلك، لأنه لا يُسمح باستخدام الأعضاء الداخليين إلا داخل هذا التجميع (في الظروف العادية، لا يتم تضمين الطرق الأخرى مثل الانعكاس)، مما يعني أن موفر العضوية الموسع الخاص بنا لا يمكنه استخدام هذه الطرق. واستنادًا إلى النطاق الحالي للتطبيق، تُستخدم هذه الأساليب حاليًا فقط في SqlMembershipProvider، لذلك أعتقد أنه يجب تغيير معدّلات الأساليب هذه إلى محمية.
2. فئة العضوية الثابتة
كما ذكرنا أعلاه، في ظل الظروف العادية، لن نستخدم تجريد MembershipProvider مباشرة، لأنه يتضمن مشكلة كيفية إنشاء مثيل لفئة خدمة العضوية الحقيقية، ويتضمن عمومًا تكوين الكائنات وإنشاء مثيل لها أسئلة صعبة، وبالنسبة للمبتدئين ليس من السهل إتقانها. في إطار عمل .NET، تتم حماية هذه الطبقة من العلاقات المعقدة من خلال عضوية الفئة الثابتة (الفئة الثابتة). بالإضافة إلى حماية المستخدمين من قراءة ملفات التكوين والكائنات الأولية والمهام الأساسية الأخرى، تلعب العضوية (الفئة الثابتة) أيضًا دورًا مهمًا في إعادة تحميل جميع MembershipProviders، لذلك توجد واجهات برمجة التطبيقات (APIs) لجعلها أكثر ملاءمة للمستخدمين لاستخدامها (الفئة الثابتة) تقوم أيضًا بإعادة تحميل هذه الأساليب المحملة كطريقة ثابتة، وتوفر تطبيقات أكثر ثراءً ومثقلة استنادًا إلى واجهة برمجة التطبيقات الأساسية الخاصة بـ MembershipProvider ليتمكن المستخدمون من الاتصال بها. يدعم هذا بشكل مباشر سواء كان ذلك في طبقة واجهة المستخدم أو مشاريع أخرى، ما عليك سوى الرجوع إلى مساحة الاسم System.Web.Security، ويمكنك الاستمتاع بوسائل الراحة المتنوعة التي توفرها العضوية دون القلق بشأن أي تفاصيل. دعونا نلقي نظرة على تعريف النموذج الأولي للعضوية (الفئة الثابتة): (استخدم عاكس .NET الخاص بـ Lutz Roder لعرض جميع تطبيقاته.)
public static class Membership
...{
// الأحداث
public static events MembershipValidatePasswordEventHandler ValidatingPassword;
// الأساليب
static Membership();
public static MembershipUser CreateUser(اسم مستخدم السلسلة, كلمة مرور السلسلة
)
;
سؤال كلمة المرور، سلسلة كلمة المرور، تمت الموافقة على منطقي، حالة
MembershipCreateStatus
؛
bool public static RemoveUser(string
username
, booldeletAllRelatedData
)
;
،
out int TotalRecords)؛سلسلة ثابتة خاصة GetCurrentUserName();
public static int GetNumberOfUsersOnline()
;
public static MembershipUser GetUser(bool
public
static MembershipUser GetUser(object ProvideUserKey);
GetUser(
string username);
GetUser
(object ProviderUserKey, bool userIsOnline
)
;
(مستخدم العضوية الثابتة)؛
ValidateUser (اسم مستخدم السلسلة، كلمة مرور السلسلة)؛
// الخصائص
public static string ApplicationName ...{ get; }
public static bool EnablePasswordReset ...{ get }
public static bool EnablePasswordRetrieval ...{ get }
public static string HashAlgorithmType ...{ get }
Internal static bool IsHashAlgorithmFromMembershipConfig ...{ get }
public static int MaxInvalidPasswordAttempts ...{ get }
public static int MinRequiredNonAlphanumericCharacters ...
{ get } public static int MinRequiredPasswordLength ...{ get }
public static int PasswordAttemptWindow ... { get }
سلسلة ثابتة عامة كلمة المرور StrengthRegularExpression ... { get }
موفر العضوية الثابتة العامة ...
{ get } موفري العضوية
الثابتة العامة ... { get } RequiresQuestionAndAnswer ... { get }
public static int UserIsOnlineTimeWindow ...{ get }
// الحقول
الخاصة static
bool s_HashAlgorithmFromConfig;
سلسلة ثابتة خاصة s_HashAlgorithmType;
Private
static Exception s_InitializeException;
ers;
int
الخاص الثابت s_UserIsOnlineTimeWindow
;
}
بعد أن قلت ذلك، يجب أن أقول بضع كلمات. في عملية النظر إلى رمز تنفيذ العضوية (الفئة الثابتة)، يمكنك أن تجد أن كل تحميل زائد لواجهة برمجة تطبيقات Memberip ينتهي باستدعاء طريقة موفر السمة. نوع هذه السمة هو نوع MembershipProvider فقط عندما ترى ذلك قد نفهم دعونا نفهم الدور المهم الذي يلعبه MembershipProvider. هناك أيضًا سمة الموفرين، وهي الحصول على كافة فئات خدمة العضوية التي تم تكوينها في web.config. إنها جميعها خصائص ثابتة، ولكن كيف يتم إنشاء مثيل لها؟ من خلال استدعاء الأسلوب Membership.Initialize()، في كل مرة يتم فيها استدعاء هاتين الخاصيتين، سيتم استدعاء هذه الطريقة لتحديد ما إذا كانت فئة الخدمة التي توفرها العضوية قد تمت تهيئتها. وإذا لم يكن الأمر كذلك، فسيتم استدعاء فئة خدمة التكوين لقراءة التكوين المحتوى للتهيئة. في هذه المرحلة قد لا يكون من الصعب عليك أن تفهم سبب سهولة استخدامه بالنسبة لنا!
3. مقدمة وتكوين استخدام SqlMembershipProvider
حسنًا، من خلال المقدمة المذكورة أعلاه، يجب أن تكون قادرًا على فهم الهيكل العام للعضوية بشكل أساسي، أليس كذلك؟ (إذا لم تقم بذلك بعد، فمن المحتمل أنك لم تفتح عاكس .NET الخاص بـ Lutz Roder لتحليل كود التنفيذ الخاص به، أو أنك لم تفهم دور الفئات المجردة بعد). ومهما كان الأمر، فإن هدفنا النهائي هو تعلم كيفية استخدامه.
قبل ذلك، أريد أولاً تقديم فئتي تنفيذ MembershipProvider المقدمتين في إطار عمل .NET: ActiveDirectoryMembershipProvider وSqlMembershipProvider (كيف تعرف هاتين الفئتين؟ يمكنك رؤية جميع الفئات الموروثة في الأنواع المشتقة من MembershipProvider.) يوفر الأول المستخدم الأساسي الإدارة ضمن Active Directory (لم أمارسها)، والأخير هو تطبيق إدارة المستخدم استنادًا إلى SqlServer الذي نستخدمه غالبًا.
لقد حان الوقت للتعريف بكيفية استخدامها. في الواقع، هناك بالفعل مقالات حول هذا الأمر في الحديقة ((ترجمة) كيفية استخدام العضوية في ASP.NET 2.0)، لذلك لن أضيع المزيد من الكلمات. ولكن هنا أريد أن أخبرك بالطريقة الأكثر مباشرة لتعلمها واستخدامها كمرجع. ابحث عن Machine.config وافتحه على قرص النظام، وابحث عن عقدة AspNetSqlMembershipProvider، ومعرفة ما إذا كان يمكنك رؤيتها في الواقع، هذا هو تكوين العضوية الأساسي، لكنه يفتقر إلى مواصفات سمة defaultProvider. يمكنك استخدام التحكم في تسجيل الدخول، ليست هناك حاجة لاستخدام أي رمز للتحقق من تسجيل دخول المستخدم. إذا كنت لا تصدق ذلك، يمكنك تجربتها. (أما بالنسبة للتحقق من النماذج، فلن أعرضه هنا. يمكنك الرجوع إلى المعلومات ذات الصلة. لمزيد من المعلومات حول SqlMembershipProvider، يرجى الرجوع إلى MSDN).
4. كيفية تخصيص MembershipProvider وموارد MembershipProvider الموجودة الأخرى
إذًا، كيف يمكننا تخصيص MembershipProvider؟ في الواقع، إذا كنت تفهم بالفعل بنية العضوية، فأعتقد أن الأمر ليس صعبًا بالنسبة لك، ومع ذلك، مع الأخذ في الاعتبار أنه لا يزال هناك قدر معين من العمل والصعوبة في كتابة MembershipProvider كاملاً. بالنسبة لنا، قد يكون هناك المزيد من الأماكن لتوسيع الموفر الحالي، مثل SqlMembershipProvider. في الواقع، هذا بسيط للغاية، نحتاج فقط إلى الوراثة من SqlMembershipProvider (أخبرك بهدوء أن ما يتم حفظه في معلمة التكوين الخاصة بطريقة التهيئة هو اسم السمة وقيمة قسم التكوين المقابل للموفر) ثم قم بالتوسيع و إعادة كتابة الأساليب المطلوبة. عند استخدامه، في قسم تكوين الموفر، قم بتغيير قيمة النوع إلى اسم الفصل الخاص بك وسيكون الأمر على ما يرام.
أخيرًا، يوجد بالفعل العديد من موفري العضوية في بيئات مختلفة في السوق، مثل mysql، وOracle، وما إلى ذلك. إليك تطبيق Mysql: http://www.codeproject.com/aspnet/mysqlmembershipprovider.asp هناك المزيد من التطبيقات المختلفة وأعتقد أنه يمكنك العثور على المزيد من المساعدة من Google.
حسنًا، لقد قلت الكثير، وآمل أن يكون مفيدًا لك يا من بذلت جهدًا في قراءة هذه المدونة، شكرًا لك ^_*.