أقدم لكم هذا الموضوع حول الأمن وأرجو لكم الفائدة
يوجد في ASP.NET عدة انظمة للأمن (security) وهي التالية
Forms-Based Authentication ويشمل
1-Forms Authentication
2- Passport Authentication
أو Using Windows-Based Authentication
إن ما سوف أتحدث عنه هو Forms Authentication وهو نظام أمان كثير الإستخدام والإنتشار
إن اول ماعليك القيام به لإستخدام هذا النظام هو أضافة الأسطر التالية في ملف web.config تحت system.web تحت configuration
<authentication mode="Forms" />
حيث تكون بهذه العملية قد حددت أنك سوف تتعامل مع نضام الأما ن Forms Authentication ويوجد لهذا القسم من الكود تفصيلات أخرى
سوف أقوم بشرحها في هذا الدرس لاحقا
بعد ذلك عليك أن تضيف تحت الكود السابق مايلي
<authorization> <deny users="?" /> </authorization>
وفي هذا القسم من الكود تكون قدد منعت كل شخص لم يسجل الدخول من التجول في الموقع حيث أن ? تعني مستخدم غير معروف أي غير مسجل
ملاحظة:
أن إستخدام الطريقة السابقة يمنع أي شخص من زيارة الموقع حيث أنه يتم فورا إعادة توجيهه إلى صفحة تسجيل الدخول وهذا أمر غير مرغوب حيث عادة يسمح لأي شخص بزيارة الموقع لكن يطلب منه التسجيل لدخول بعض الصفحات على سبيل المثال يمنع من إضافة مشاركة لذلك لانستخدم الكود السابق والحل لمنع الشخص من زيارة صفحات محددة إستخدام عنصر أخر في ملف الweb.config وهو <location> </location> وسأتي على شرحه في نهاية الدرس
ملاحظة:
من أجل إعطاء ترخيص السماح نستخدم <allow> ومن اجل الإشارة إلى جميع المستخدمين المسجلين نستخدم <allow users="*" /> حيث * إشارة إلى كل المستخدمين المسجلين
الأن سوف ننتقل إلى عملية التسجيل وتسجيل الدخول حيث سوف نقوم بإعداد صفحة الدخول للموقع
وبعد تصميم صفحة الدخول حيث نستخد م مربع نص لأدخال إسم المستخدم و أخر لإدخال كلمة المرور و checkbox لتحديد هل يريد المستخدم
تذكر بياناته أم لا سوف نضع الكود التالي لزر الدخول
If (txtUsername.Text == "aaa" And txtPassword.Text == "sss" )
{
FormsAuthentication.RedirectFromLoginPage( txtUsername.Text, chkRemember.Checked );
}Else{
إظهار رسالة خطأ
}وهكذا في حال كانت بيانات المستخدم صحيحة نقوم بتسجيل دخوله من خلال الطريقة RedirectFromLoginPage التي تاخذ معاملين الأول
معامل نصي إسم المستخدم الذي سوف يوضع في الكوكيز والثاني معامل منطقي لتحديد هل نريد تذكر بيانات المستخدم أم لا
وهنا أذكر أن المنهج RedirectFromLoginPage يقوم بإعادة توحيه المستعرض إلى الصفحة التي قد أرسلته إلي صفحة الدخول
الأن سوف أتحدث عن تحديد خيارات Forms Authentication وأورد المثال التالي ثم أوضحه
<configuration> <system.web> <authentication mode="Forms"> <forms name=".myname" loginUrl="login.aspx" protection="All" timeout="80" path="/" /> </authentication> </system.web> </configuration>
-- الخيار الأول name يستخدم لتحديد إسم الكوكيز التي سوف يتم إنشائها عند دخول المستخدم و التي تكون بشكل تلقائي أي عند عدم تحديدها
.ASPXAUTH
-- الخيار الثاني loginUrl يحدد الصفحة التي سوف يتم توجيه الزائر إليها عند طلبه لصفحة لايسمح لغير المسجلين بالدخول إليها وهي طبعا
صفحة تسجيل الدخول التي كنا قد أعددناها سابقا
-- الخيار الثالث protection يحدد الطريقة التي سوف يتم حماية بيانات الكوكيز من خلالها وهذا الخيار يأخذ حدى القيم التالية
All, None, Encryption,Validation القيمة الإفتراضية ALL
-- الخيار الرابع timeout يحدد زمن الإحتفاظ بالكوكيز
-- الخيار الخامس path مسار الكوكيز
الأن أعود إلى كود تسجيل الدخول حيث كنت قد إفترضت أن إسم المستخدم aaa وأن كلمة المسر sss لكن بالطبع عند التسجيل لن تكون كلمة السر
محددة بهذه الطريقة و هي في الأغلب ستكون موجودة في جدول للمستخدمين وبالتالي يجب البحث عن البيانات المدخلة في ذلك الجدول للتأكد من أن
الشخص مسجل وأنه قد أدخل بياناته بشكل صحيح و الكود التالي يبين كيفية البحث عن بيانات المستخدم في قاعدة البيانات
SqlConnection cn = new SqlConnection(ConfigurationManager.AppSettings["connectionstring"]);
SqlCommand cm = new SqlCommand("select [username],[password] from [tbuser] where username='" + tusername.Text + "'and tpassword='" + pass.Text + "'", cn);
cn.Open();
SqlDataReader rd = cm.ExecuteReader();
if (rd.Read())
{
FormsAuthentication.RedirectFromLoginPage(username.Text, rem.Checked);
}
else
{
Label2.Visible = true;
}
cn.Close();حيث نقوم بتعريف متحول من نوع SqlConnection يأخذ قيمته سلسلة الإتصال المخزنة من ملف web.config
ثم عرفنا SqlCommand و زودناه بعبارة sql تبحث من أسم المستخدم المدخل من خلال مربع نص أسميناه tusername وكلمة السر
المدخلة في مربع نص أسميناه tpassword في جدول المستخدمين الذي أفترض ان إسمه tbuser
بعد ذلك نفتح الإتصال وننشء قارء بيانات ثم نتاكد هل أعاد الإستعلام قيمة أي أن المستخدم موجود في قاعدة البيانات أي أن القارء سوف
يقوم بالقراءة وفي حال تم ذلك نسجل دخول المستخدم من خلال المنهج RedirectFromLoginPage الذي قد شرحناه سابقا
أما في حال كانت البيانات خاطئة نظهلر رسالة خطأ تكون مخفية أفتراضيا وهي مكتوبة على Label إسمها Label2
الأن أنتقل إلى موضوع أكثر تقدما وهو التسجيل مع تحديد مستويات للمستخدمين
لإعطاء المستخدم مستوا ما عليك أولا أن تعد عمود في جدول المستخدمين ليكن إسمه rol تحدد من خلاله مستوى لكل مستخدم
بعد ذلك نزود المستخدم بامستوى وللقيام بذلك عليك مايلي
أضف إلى ملف ال Global.asax الكودالمنهج التالي
void Application_AuthenticateRequest (object sender,EventArgs e)
{
}هذا المنهج يستدعى عند كل طلب لصفحة ما من قبل المستخدم
ثم أضف إلى رأس الملف السابق ما يلي
<%@ Import Namespace="System.Data.SqlClient" %> <%@ Import Namespace="System.Security.Principal" %>
حيث قمنا بإستيراد فضائي الأسماء SqlClient و Security.Principal
الأن نقوم بإضافة الكود الذي يزود المستخدم بالمستوى ,ونضعه ضمن المنهج السابقApplication_AuthenticateRequest وهو التالي
SqlConnection cn = new SqlConnection(ConfigurationManager.AppSettings["connectionstring"]);
SqlCommand cm = new SqlCommand("select [rol] from [tbuser] where [username]='" + Context.User.Identity.
Name+ "'" , cn);
cn.Open();
SqlDataReader dr= cm.ExecuteReader();
dr.Read();
string[] rols={dr[0].ToString()};
Context.User = new GenericPrincipal(Context.User.Identity, rols);هذا الكود يتصل بقاعدة البيانات ويحصل على المستوى المافق للمستخدم من العمود rol ثم عن طريق المنهج new GenericPrincipal نقوم
بتزويد المستخدم بالمستوى الموافق
أما كيفية الإستغادة من هذه العملية أي المستوى فتكون كمايلي
if(User.IsInRole("المستوى")
{
الكود الذي تريده
}ويمكن الإستفادة من هذه العملية في ملف الweb.config حيث نحدد الدخوال أو المنع حسب المستوى فمثلا أفترض أن لديك لوحة تحكم تريد
السماح فقط للمدير الذي يكون مستواه مثلا admin ويكون ذلك كمايلي
<location path="control"> <system.web> <authorization> <allow roles="admin"/> <deny roles="user"/> <deny users="?"/> </authorization> </system.web> </location >
لقد إستخدمنا عنصرا جديدا وهو <localtion> وهو يستخدم من أجل تحديد السماح والمنع من أجل ملف او مسار ما وقد لإفترضت أن ملفات
لوحة التحكم موضوعة ضمن مجلد إسمه control وقمت بتحديد الصلاحيات لهذا المجلد
سمحت لمن لديه المستوى admin عن طريق <allow roles="admin"/>
منعت من سجل الدخول كمستخدم عادي <deny roles="user"/>
منعت من لم يسجل الدخول <deny users="?"/>
ملاحظة كود تسجيل الخروج هو
FormsAuthentication.SignOut();
أرجو ان اكون قد حققت الفائدة للجميع