بعد ظهور ASP.net 2.0، كنت أرغب دائمًا في استخدام Membership 2.0، وهي أداة جيدة لإدارة أذونات مواقع الويب. لقد استخدمت SQLProvider، واستخدمت aspnet_regsql لإنشاء الجداول المطلوبة، وقمت بتكوين web.config، ومع ذلك، واجهت العديد من المشكلات في الاستخدام الفعلي، بما في ذلك الحصول على المستخدم الذي قام بتسجيل الدخول حاليًا من خلال Membership.GetUser() بعد تسجيل الدخول. تم إرجاع رمز النتيجة. بالنسبة لي كانت فارغة... يبدو أن إعدادات المصادقة والترخيص المضمنة في تكوين الويب ليس لها أي تأثير على الإطلاق، وبعد إجراء بعض البحث، ما زلت غير قادر على حل هذه المشكلة، لذلك لم يكن لدي أي خيار سوى استخدام العضوية، لكنني قمت بتنفيذ عملية المصادقة والترخيص بأكملها في حد ذاتها.
نظرًا لأن التحكم في تسجيل الدخول لم يعمل، فقد كتبت صفحة تسجيل الدخول.aspx بنفسي. تستخدم هذه الصفحة وظيفة Membership.ValidateUser() للحكم على تسجيل دخول المستخدم. بعد تسجيل دخول المستخدم بنجاح، يتم حفظ اسم المستخدم الخاص بالمستخدم في الجلسة.
لقد قمت بتنفيذ كائن XML متسلسل قابل للتكوين، والذي يحتوي على البنية التالية
<?xml version="1.0"?>
<SecurityConfig xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance " xmlns:xsd=" http://www.w3.org/2001/XMLSchema ">
<مواقع الصفحات>
<PageLocation Location="~/admin/admin/RoleManager.aspx">
<السماح بالأدوار = "المسؤول" />
</موقع الصفحة>
</PageLocations>
</SecurityConfig>
PageLocations عبارة عن مجموعة من كائنات القائمة الخاصة بـ PageLocation. يحتوي الموقع في Pagelocation على الصفحة التي سيتم إضافة الأذونات إليها. يحتوي موقع الصفحة على كائن السماح، أحدها هو الأدوار، والذي يحتوي على أدوار المستخدم التي يمكن ترخيصها بواسطة الصفحة، ويمكن فصلها بفواصل، بحيث تتم إضافة جميع الصفحات إلى بنية XML هذه.
ثم قم بتنفيذ الوظيفة التالية:
/// <summary>
/// ما إذا كان الوصول إلى هذه الصفحة مسموحًا به أم لا
/// </الملخص>
/// <param name="url">المسار المعتمد</param>
/// <param name="rolenames">أدوار التفويض</param>
/// <returns>سواء كان مصرحا به</returns>
المنطق العام هو السماح (Uri url،string[] rolenames،HttpContext context)
{
string path=context.Server.MapPath(url.AbsolutePath);
PageLocation theLocation = null;
foreach (موقع PageLocation في pageLocations)
{
تمدد السلسلة؛
strlocation=context.Server.MapPath(location.Location);
إذا (strlocation.ToLower() == المسار.ToLower())
{
الموقع = الموقع؛
}
}
إذا (الموقع ! = فارغ)
{
سلسلة[] الأدوار = theLocation.Allow.Roles.Split(',');
foreach (دور السلسلة في الأدوار)
{
foreach (اسم دور السلسلة في أسماء الأدوار)
{
إذا (اسم الدور == الدور)
{
عودة صحيحة؛
}
}
}
عودة كاذبة.
}
آخر
{
عودة كاذبة.
}
}
من خلال مقارنة المسار المطلق للصفحة التي تمت زيارتها حاليًا بالمسار المطلق في XML، ثم الحصول على كائن Pagelocation الموضح في XML، لتحديد ما إذا كان دور السماح الخاص به يتطابق مع دور المستخدم الحالي في تنفيذ ترخيص الأمان.
نظرًا لأن إدارتي تُستخدم لإدارة أمان الخلفية، فقد كتبت عنصر تحكم مستخدم لتغليف فئة SecurityConfig، والحصول على حساب المستخدم الذي تم تسجيل الدخول من خلال context.Session[]، ثم الحصول على تسجيل الدخول من خلال الأدوار.GetRolesForUser(اسم المستخدم) دور المستخدم ، ثم قم بتمرير context.Request.Url والأدوار إلى الوظيفة الآن. إذا كان المستخدم مرخصًا له، فسيتم عرض الصفحة الحالية. وإلا، فسوف ينتقل إلى صفحة تسجيل الدخول الخاصة به أو سيطالبك بأنه ليس لديك مثل هذا الإذن .
نظرًا لأنني أستخدم MasterPage، فأنا في هذه الحالة أحتاج فقط إلى ربط عنصر التحكم هذا بالصفحة الرئيسية، بحيث تكون كل صفحة تحت الإدارة، وكتابة صفحة في الخلفية تقوم بتحرير كائن SecurityConfig وإجراء تسلسل له، وهذا يحقق التحكم في الأذونات لجميع الصفحات.
يعد اعتماد هذه الطريقة أيضًا فكرة جيدة عندما لا تعمل العضوية. وبهذه الطريقة، فهي لا تستفيد فقط من الوظائف الأساسية التي توفرها العضوية للمستخدمين مثل CreateUser وCreateRoles، ولكنها تلبي أيضًا الحاجة إلى إعدادات الأذونات الطريقة الوحيدة للتعامل معها الآن.
هذه هي المرة الأولى التي أقوم فيها بالنشر على الصفحة الرئيسية، وآمل أن يتمكن أحد من إخباري تحت أي ظروف لن يعمل ترخيص .net.
http://www.cnblogs.com/livesite/archive/2006/08/14/membership.html