الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

درس الأمن في ASP.NET

مغلق
بدأه أنس العلي في 9 يونيو 2006 · 1 رد · 2,417 مشاهدة · في ASP.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

أقدم لكم هذا الموضوع حول الأمن وأرجو لكم الفائدة

يوجد في 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();

أرجو ان اكون قد حققت الفائدة للجميع

#2

أكثر من جيد و لبكن يعيبه عدم وجود البيسك و له سبتها يا أنس ؟؟؟

هذا الموضوع مغلق.

مواضيع مشابهة