17-09-12, 01:03 PM
السلام عليكم ورحمة الله وبركاته,
كثيرًا ما يطرح الأخوة بالمنتدى سؤالاً عن كيفية بناء نظام للتعرف على المستخدمين وكذا إدارة صلاحياتهم وتخصيص مظهر التطبيقات بناءًا على مدى امتلاك المستخدم الصلاحيات الكافية للقيام بالمهام المتاحة له, فمثلاً , قد تريد تعطيل ال Controls التي تمثل الوظائف Functionalities الموجودة في تطبيقك إذا كان المستخدم الذي قام بتسجيل الدخول إلى التطبيق لا يملك الصلاحية للقيام بها.
وفي الحقيقة منذ إصدار .NET 2.0 قدمت ASP.NET نموذج أو Model جاهز لاستخدامه في تطبيقات الويب من أجل القيام بمثل هذه المهام , وهذا النموذج يعتمد على استخدام قاعدة بيانات SQL Server Express ويمكنك بسهولة استخدام قاعدة البيانات الخاصة بك كبديل, بالإضافة إلى ذلك هناك ومجموعة من الفئات المساعدة والموجودة في مجال الأسماء System.Web.Security. سيتكفل هذا النموذدج بجميع العمليات المطلوبة من أجل Authentication و Authorization مثل MembershipUser Class و Membership Class و Roles Class.
فكرة عمل هذا ال Model تقوم على عمل Implementation للفئة MembershipProvider وتعتبر الفئة SqlMembershipProvider إحدى الفئات الموروثة من الفئة السابقة , واستخدامها لا يقتصر فقط على ASP.NET بل يمكن استخدامها في أي تطبيق دوت نت سواء كان Console App أو WinForms App أو WPF , كما أنك تستطيع عمل Implementation خاص بك , كل ما عليك فقط هو تعريف فئة جديدة موروثة من الفئة MembershipProvider, والقيام ببعض التعديلات على الملف app.config .لمعرفة المزيد حول كيفية عمل Membership Provider خاص بك يمكنك مراجعة الصفحة التالية http://msdn.microsoft.com/en-us/library/44w5aswa.aspx
نفس الأمر ينطبق على Authorization , حيث يوجد فئة قاعدية (Abstract) هي الفئة System.Web.Security.RoleProvider حيث دور هذه الفئة هو التحكم وإدارة صلاحيات المستخدمين, ويوجد هناك Implementation لهذه الفئة وهي System.Web.Security.SqlRoleProvider ويمكن الاستعانة بها مباشرة, أما إذا كنت ترغب في عمل Role Provider خاص بك فيمكنك عمل Inheritance للفئة السابقة, ويمكنك الاستعانة بالرابط التالي للمزيد من التفاصيل: http://msdn.microsoft.com/en-us/library/tksy7hd7.aspx
يمكن استخدام هذه الميزة أيضًا إذا كان لديك تطبيق يعمل على الشبكة وترغب في استخدام قاعدة البيانات واحدة بحيث يمكن لجميع الأجهزة الاتصال بها عن طريق برنامجك واستخدام نفس ال Membership Provider . وفيما يلي خطوات العمل .
- قبل البدء عليك التأكد من أن التطبيق يستخدم .NET Framework 3.5 SP1 / 4.0 Extended وليس الإصدار Client Profile أما إذا كنت تستخدم .NET 2.0 فليس هناك مشكلة .
- في البداية تحتاج لإنشاء قاعدة بيانات جديدة من نوع SQL Server حصرًا , أما إذا كنت تريد استخدام قاعدة بيانات موجودة مسبقًا , باستخدام الأداة aspnet_regsql.exe والتي يمكن الوصول إليها من خلال Visual Studio Command prompt .
بعد إدخال الأمر aspnet_regsql.exe ستظهر واجهة المعالج:
حدّد الخيار الأول من أجل تكوين قاعدة البيانات وإضافة الجداول الازمة, واضغط Next - بالنسبة للخيار الثاني يمكنك استخدامه إذا أردت حذف جميع الجداول المتعلقة بال Sql Membership Provider -
الآن قم بتحديد Sql Server Instance Name و كذا اسم قاعدة البيانات التي ستستخدمها, إذا لم تكن قد انشأتها بعد فيمكنك ذلك الآن فقط اكتب اسم قاعدة البيانات الجديدة في الحقل Database, ثم أنقر Next ثم Finish .
لآن أصبحت قاعدة البيانات جاهزة , وستحتاج لاستخدام ال ConnectionString الخاص بها والذي يمكن الوصول إليه من خلال إضافة اتصال جديد عن طريق Server Explorer في Visual Studio.
الآن اتجه نحو التطبيق الخاص بك واتبع الخطوات التالية:
- قم بإضافة المرجع System.Web.dll .
-بعد ذلك قم بإضافة app.config إلى مشروعك في حال لم يكن موجودًا مسبقًا, من خلال Project -> Add New Item -> Application Configuration File .
- قم بتعديل ملف app.config الذي أضفته للتو , كما في المثال التالي مع مراعاة نص الاتصال:
بالنسبة لل Attributes الخاصة بال Provider مثل SqlMembershipProvider و SqlRoleProvider والتي تظهر في app.config يمكن تخصيصها حسب ما تريد (شرحها خارج هذا الموضوع) , يمكنك الاستعانة بالروابط التالية لمعرفة كيفية استخدامها بالشكل المناسب:
بالنسبة لل Role Provider من هنا: http://msdn.microsoft.com/en-us/library/ms164660.aspx
بالنسبة لل Membership Provider من هنا: http://msdn.microsoft.com/en-us/library/1b9hw62f.aspx
الآن أصبح يمكنك الاستفادة من الفئة Membership و Roles لإدارة المستخدمين والصلاحيات, وفيما يلي مثال على كيفية استخدامها ضمن Console App :
بالتوفيق والسلام عليكم ورحمة الله وبركاته.
كثيرًا ما يطرح الأخوة بالمنتدى سؤالاً عن كيفية بناء نظام للتعرف على المستخدمين وكذا إدارة صلاحياتهم وتخصيص مظهر التطبيقات بناءًا على مدى امتلاك المستخدم الصلاحيات الكافية للقيام بالمهام المتاحة له, فمثلاً , قد تريد تعطيل ال Controls التي تمثل الوظائف Functionalities الموجودة في تطبيقك إذا كان المستخدم الذي قام بتسجيل الدخول إلى التطبيق لا يملك الصلاحية للقيام بها.
وفي الحقيقة منذ إصدار .NET 2.0 قدمت ASP.NET نموذج أو Model جاهز لاستخدامه في تطبيقات الويب من أجل القيام بمثل هذه المهام , وهذا النموذج يعتمد على استخدام قاعدة بيانات SQL Server Express ويمكنك بسهولة استخدام قاعدة البيانات الخاصة بك كبديل, بالإضافة إلى ذلك هناك ومجموعة من الفئات المساعدة والموجودة في مجال الأسماء System.Web.Security. سيتكفل هذا النموذدج بجميع العمليات المطلوبة من أجل Authentication و Authorization مثل MembershipUser Class و Membership Class و Roles Class.
فكرة عمل هذا ال Model تقوم على عمل Implementation للفئة MembershipProvider وتعتبر الفئة SqlMembershipProvider إحدى الفئات الموروثة من الفئة السابقة , واستخدامها لا يقتصر فقط على ASP.NET بل يمكن استخدامها في أي تطبيق دوت نت سواء كان Console App أو WinForms App أو WPF , كما أنك تستطيع عمل Implementation خاص بك , كل ما عليك فقط هو تعريف فئة جديدة موروثة من الفئة MembershipProvider, والقيام ببعض التعديلات على الملف app.config .لمعرفة المزيد حول كيفية عمل Membership Provider خاص بك يمكنك مراجعة الصفحة التالية http://msdn.microsoft.com/en-us/library/44w5aswa.aspx
نفس الأمر ينطبق على Authorization , حيث يوجد فئة قاعدية (Abstract) هي الفئة System.Web.Security.RoleProvider حيث دور هذه الفئة هو التحكم وإدارة صلاحيات المستخدمين, ويوجد هناك Implementation لهذه الفئة وهي System.Web.Security.SqlRoleProvider ويمكن الاستعانة بها مباشرة, أما إذا كنت ترغب في عمل Role Provider خاص بك فيمكنك عمل Inheritance للفئة السابقة, ويمكنك الاستعانة بالرابط التالي للمزيد من التفاصيل: http://msdn.microsoft.com/en-us/library/tksy7hd7.aspx
يمكن استخدام هذه الميزة أيضًا إذا كان لديك تطبيق يعمل على الشبكة وترغب في استخدام قاعدة البيانات واحدة بحيث يمكن لجميع الأجهزة الاتصال بها عن طريق برنامجك واستخدام نفس ال Membership Provider . وفيما يلي خطوات العمل .
- قبل البدء عليك التأكد من أن التطبيق يستخدم .NET Framework 3.5 SP1 / 4.0 Extended وليس الإصدار Client Profile أما إذا كنت تستخدم .NET 2.0 فليس هناك مشكلة .
- في البداية تحتاج لإنشاء قاعدة بيانات جديدة من نوع SQL Server حصرًا , أما إذا كنت تريد استخدام قاعدة بيانات موجودة مسبقًا , باستخدام الأداة aspnet_regsql.exe والتي يمكن الوصول إليها من خلال Visual Studio Command prompt .
بعد إدخال الأمر aspnet_regsql.exe ستظهر واجهة المعالج:
حدّد الخيار الأول من أجل تكوين قاعدة البيانات وإضافة الجداول الازمة, واضغط Next - بالنسبة للخيار الثاني يمكنك استخدامه إذا أردت حذف جميع الجداول المتعلقة بال Sql Membership Provider -
الآن قم بتحديد Sql Server Instance Name و كذا اسم قاعدة البيانات التي ستستخدمها, إذا لم تكن قد انشأتها بعد فيمكنك ذلك الآن فقط اكتب اسم قاعدة البيانات الجديدة في الحقل Database, ثم أنقر Next ثم Finish .
لآن أصبحت قاعدة البيانات جاهزة , وستحتاج لاستخدام ال ConnectionString الخاص بها والذي يمكن الوصول إليه من خلال إضافة اتصال جديد عن طريق Server Explorer في Visual Studio.
الآن اتجه نحو التطبيق الخاص بك واتبع الخطوات التالية:
- قم بإضافة المرجع System.Web.dll .
-بعد ذلك قم بإضافة app.config إلى مشروعك في حال لم يكن موجودًا مسبقًا, من خلال Project -> Add New Item -> Application Configuration File .
- قم بتعديل ملف app.config الذي أضفته للتو , كما في المثال التالي مع مراعاة نص الاتصال:
كود :
<?xml version="1.0"?>
<configuration>
<connectionStrings>
<add name="SqlServices" connectionString="Data Source=.\sqlexpress;Initial Catalog=MyDB;Integrated Security=True"/>
</connectionStrings>
<system.web>
<membership defaultProvider="SqlProvider" userIsOnlineTimeWindow="15">
<providers>
<add name="SqlProvider"
type="System.Web.Security.SqlMembershipProvider"
connectionStringName="SqlServices"
enablePasswordRetrieval="false"
enablePasswordReset="true"
passwordStrengthRegularExpression=""
requiresQuestionAndAnswer="false"
minRequiredPasswordLength="6"
passwordFormat="Hashed"
applicationName="/"
minRequiredNonalphanumericCharacters="0"/>
</providers>
</membership>
<roleManager defaultProvider="SqlProvider" enabled="true" cacheRolesInCookie="true" cookieName=".ASPROLES" cookieTimeout="30" cookiePath="/" cookieRequireSSL="true" cookieSlidingExpiration="true" cookieProtection="All">
<providers>
<add name="SqlProvider"
type="System.Web.Security.SqlRoleProvider"
connectionStringName="SqlServices"
applicationName="/"/>
</providers>
</roleManager>
</system.web>
</configuration>
بالنسبة لل Attributes الخاصة بال Provider مثل SqlMembershipProvider و SqlRoleProvider والتي تظهر في app.config يمكن تخصيصها حسب ما تريد (شرحها خارج هذا الموضوع) , يمكنك الاستعانة بالروابط التالية لمعرفة كيفية استخدامها بالشكل المناسب:
بالنسبة لل Role Provider من هنا: http://msdn.microsoft.com/en-us/library/ms164660.aspx
بالنسبة لل Membership Provider من هنا: http://msdn.microsoft.com/en-us/library/1b9hw62f.aspx
الآن أصبح يمكنك الاستفادة من الفئة Membership و Roles لإدارة المستخدمين والصلاحيات, وفيما يلي مثال على كيفية استخدامها ضمن Console App :
PHP كود :
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Web.Security;using System.Security.Principal;
namespace ConsoleApplication1{ class Program { static void Main(string[] args) { // Create a new user and check for success MembershipCreateStatus status; var user = CreateUser("Islam Ibrahim", "passWord", "myEmail@gmail.com", out status); if (user == null) { Console.WriteLine("Creation failed due to an error: {0}", status.ToString()); return; }
// Display newly created user's Info Console.WriteLine("User created successfully!"); Console.WriteLine(string.Format("User name: {0}", user.UserName)); Console.WriteLine(string.Format("User email: {0}", user.Email));
// Create a role for the user CreateRoleForUser(user, "Admin", true);
// Attempt to login with newly created user Console.WriteLine("Enter the user name:"); var userName = Console.ReadLine(); Console.WriteLine("Enter password:"); var password = Console.ReadLine(); ValidateUser(userName, password);
// Check the logged-in user for a specific role CheckForUserRole("Admin"); }
private static void CheckForUserRole(string role) { if (System.Threading.Thread.CurrentPrincipal.IsInRole(role)) Console.WriteLine("Current logged user is in role: {0}", role); else Console.WriteLine("Current logged user is not in role: {0}", role);
}
public static MembershipUser CreateUser(string userName, string password, string email, out MembershipCreateStatus status) { var result = Membership.CreateUser( userName , password , email , "None", "None", true, out status); return result; }
public static void CreateRoleForUser(MembershipUser user, string role, bool createRoleIfNotPresent) { if (user == null) throw new ArgumentNullException("user");
if (Roles.IsUserInRole(user.UserName,role)) throw new ArgumentException("role", "User has already the supplied role!");
if (!Roles.GetAllRoles().Contains(role) && createRoleIfNotPresent) Roles.CreateRole(role); Roles.AddUserToRole(user.UserName, role); }
public static void ValidateUser(string userName, string password) { if (Membership.ValidateUser(userName, password)) { Console.WriteLine("User validated!");
// Set current principal for current user var identity = new GenericIdentity(userName); var principal = new RolePrincipal(identity); System.Threading.Thread.CurrentPrincipal = principal; } else Console.WriteLine("Invalid user name or password!"); } }}
بالتوفيق والسلام عليكم ورحمة الله وبركاته.