الشبكة العربية لمطوري الألعاب

خبير  أحمد عزالدين مشاركة 1

السلام عليكم

اليوم اود التحدث معكم عن بعض امكانيات بيئة الـ asp.net لتطوير المواقع وبرمجتها
تقدم لنا بيئة تطوير المواقع الكثير من الامكانيات والتسهيلات واليوم نتحدث عن طريقتين يدويتين
لاضافة طريقة تمكننا من عمل شاشة login page وادارتها بابسط الطرق ناهيك ايضا عن استخدام
الكثير من المميزات التلقائية التى تقدمها لنا اللغة مثل الادوات الخاصة بالـ security

=== الطريقة الاولي لعمل وادارة شاشة الـ login
- ملاحظة انظر الملف المرفق لرؤية الكود كاملا
اذا كان لدينا مشروع من نوع asp.net website وعندنا صفحة login.aspx
يمكننا تحرير الملف web.config وهو عبارة عن ملف اعدادات مكتوب بصيغة xml ويمكن تحريره
بطريقتين اما باستخدام الـ asp.net configuration tool من قائمة project او بفتح الملف يدويا
بالضغط عليه من نافذة الـ solution explorer
المهم انه يمكننا اضافة قسم اسمه Authentication كما هو موضح في الملف المرفق وفيه حددنا نوع
الحماية بانها من نوع forms اي اننا لن نعتمد علي الحماية المقدمة من نظام التشغيل بالنسبة لاعدادات
المستخدمين وانما سندير نحن الجماية بأنفسنا كأن نستخدم مثلا قاعدة بيانات لتخزين بيانات وصلاحيات
كل مستخدم - وكذلك حددنا الصفحة التى سيقوم السيرفر بعمل اعادة توجيه لها في حالة  اذا كان
المستخدم يحاول الوصول لاي صفحة غير مسموح له بالوصول اليها او لم يكن قد عمل login
ايضا حددنا في الملف نوع الـ authorization وهو من يحق له الدخول ومن لا يحق له
وقمنا هنا بوضع الجملة:
deny users="?"
ومعناها  امنع كل المستخدمين تلقائيا من الدخول لاي صفحة في الموقع ما عدا المستخدمين الذين قاموا
بعمل login ويمكننا استبدال علامة الاستفهام بعلامة النجمة * لمنع كافة المستخدمين او يمكننا استخدام
allow users="*"
وذلك للسماح لكافة المستخدمين -
يمكننا ايضا تحديد مسارات او صفحات معينه لتكون ذات صلاحيات اعلي داخل القسم

authorization

=== الطريقة الثانية لعمل وادارة شاشة الـ login
ايضا تم وضع مثال في الملف المرفق
- لاحظ هذه الطريقة تعتمد بالكامل علي مفهوم الـ session
ولمن لا يعرف ما هي ال session هي عبارة عن مدة تمثل جلسة المستخدم داخل الموقع يعني عندما
يدخل اي شخص للموقع يتم فتح session له ولتكن بمدة ربع ساعة فاذا لم يقم بعمل اي نشاط او زيارة
اي صفحة داخل الموقع يتم عمل expire للـ session الخاصة به وبالتالي يطلب منه عمل login

مرة اخري عند زيارة اي صفحة.
برجاء مراجعة الملف المرفق الذي يحتوي علي مثالين احدهما يستخدم طريقة الـ session والاخر
يستخدم الاسلوب المقدم من asp.net لادارة سماحيات المستخدمين

وانا مستعد للاجابة عن اي استفسار في الامكان ان شاء الله
والسلام عليكم

أحمد عزالدين
طالب دراسات عليا
جامعة كالجري

خبير مدير وسام البهنسي مشاركة 2

في 13 مارس 2008 07:39 ص، غمغم ahmed ezz باستغراب قائلاً:

وقمنا هنا بوضع الجملة:
deny users="?"
ومعناها  امنع كل المستخدمين تلقائيا من الدخول لاي صفحة في الموقع ما عدا المستخدمين الذين قاموا
بعمل login ويمكننا استبدال علامة الاستفهام بعلامة النجمة * لمنع كافة المستخدمين او يمكننا استخدام
allow users="*"
وذلك للسماح لكافة المستخدمين -

لا أخفيك أننا حاولنا استخدام نظام ASP.NET لإدارة الحسابات والـ login، لكن كما ذكرت في مثالك، لا يتم السماح برؤية الصفحة إن لم ينجح التسجيل، وهذه ليست هي الحال في موقعنا هذا مثلاً أو حتى في أغلب المواقع العامة، حيث أننا نود أيضاً السماح برؤية محتويات الصفحة لغير المسجلين، إلا أننا فقط نزيل إمكانية المشاركة وإضافة تعديلات...
 
فهل ترى أنه يمكن إنجاز طريقة التصرف هذه باستخدام نظام ASP.NET لإدارة الحسابات؟ وإن كان الجواب نعم، فكيف؟!
 
شكراً!

وسام البهنسي
مبرمج في إنفيديا وإنفريمز

خبير  أحمد عزالدين مشاركة 3

السلام عليكم اخي وسام

اعتقد ان انه يمكن عمل ذلك بنظام ال asp.net وذلك باستخدام مفهوم ال session كاساس بدلا من استخدام اسلوب
ال forms authentication ولقد ارفقت مشروع بسيط يوضح المفكرة

اعتقد ان الحل السريع للمشكلة هو باستخدام ال session
اخي وسام اري انك اذا استخدمت الـ session كاسلوب لادارة الـ login فانه يتيح لك كافة الحرية التي ترغب بها لجعل اناس معينين ان يزوروا صفحات معينة سأعطيك مثال:

يمكنك مثلا انشاء session لكل شخص في الملف global.asax كما هو موضح في المثال المرفق
ولكن يمكنك بسهولة ان تعمل فحص لقيمة ال session في كل صفحة تريد ان يظهر جزء منها فقط مثل المقالة كأن تسمح للزائر بقراءة المقالة
حتي ولو لم يكن قد عمل login ولكن عندما تعمل هذا الفحص يمكنك ان تخفي الازرار التي تسمح بالتعديل واذا كان هاذ الشخص قد عمل login
يمكنك بسهولة ان تظهر له هذه الازرار

لكنى اعتقد انه يمكن تنفيذ هذه الفكرة ايضا بطريقة اكثر احترافية وتعطيك كافة التحكم الذي تريده لكنها تحتاج لخبرة عالية
وهذه الطريقة تعتمد بالاساس علي اعادة وراثة الكائنات المسؤلة عن الوظائف الاساسية في بيئة ال asp.net
مثلا يمكنك اعادة انشاء provider للـ security ليسمح لك تلقائيا بعمل اسلوب حماية قوي جدا وديناميكا
لتفهم الفكرة - تخيل انك تريد عمل صفحة كشاشة دخول المستخدمين وتريد ان تكون هذه الشاة ديناميكية لتوفر مستوى امن عالي في الموقع
مثلا اذا ادخل المستخدم اسمه او كلمة مروره 3 مرات خاطئة متتالية فان النظام لا يسمح له باعادة محاولة الدخول الا بعد مرور فترة زمنية
 ولتكن ربع ساعة أو ليسأله عن معلومات اكثر من مجرد اسمه وكلمة مروره وذلك لزيادة التأكد ان هذا الشخص لا يحاول تجربة كلمات المرور
او استخدام ادوات تعمل تضغط علي الموقع كفكرة المواقع التي عندما تقوم بالتسجيل فيها تطلب منك ادخل الارقام والحروف الموجودة
داخل صورة تم توليدها ديناميكيا لتمنع ال auto registration

كل هذا واكثر يمكن التحكم فيه بعمل وراثة لل http module/handles  وللـ provider المقدمة من ال asp.net

يمكن ايضا استخدام مفهوم ال roles لعمل مجموعات من المستخدمين كل مجموعة لها سماحيات معينة كمجموعة المدراء ومجموعة الاعضاء
بصلاحيات اضافية ومجموعة الزاور وهكذا ...

يمكنك معرفة المزيد عن هذا الموضوع من كتاب ASP.NET 2.0 MVP Hacks and Tips
او من موقع ميكروسوفت الرسمي MSDN او من موقع ال asp.net الرسمى http://asp.net

لا تنيى المشروع المرفق يحتوى علي مثال لاستخدام ال session كاسلوب حماية ديناميكي للتحكم في حماية كل صفحة بل
كل جزء من الصفحة علي حدة

شكرا
والسلام عليكم

أحمد عزالدين
طالب دراسات عليا
جامعة كالجري

خبير مدير وسام البهنسي مشاركة 4

أما في 13 مارس 2008 01:18 م، فقد تنهد ahmed ezz بارتياح وهو يرد:

اعتقد ان انه يمكن عمل ذلك بنظام ال asp.net وذلك باستخدام مفهوم ال session كاساس بدلا من استخدام اسلوب
ال forms authentication ولقد ارفقت مشروع بسيط يوضح المفكرة

هذا هو ما نستخدمه حالياً، إلا أنني ظننت أن هناك طريقة لاستخدام الـ forms authentication للوصول إلى نفس النتيجة.
المشكلة في نظام الـ session أنك تحتاج إلى حفظ معلومات الـ session في مكان ما في ذاكرة المخدم إن قررت استخدام خاصية InProc لذلك. وهذا يعرض الزوار لمشاكل إن تم إعادة تشغيل برنامج الموقع أثناء زيارتهم، وهو أمر خارج عن نطاق سيطرتنا لأننا نستخدم مخدماً مشتركاً مع مواقع عديدة أخرى.
 
شكراً على كل حال!

وسام البهنسي
مبرمج في إنفيديا وإنفريمز

خبير مشرف مؤيد مارديني مشاركة 5

إن كنتُ فهمت قصدكما فالأداة LoginView تقوم بهذه المهمة، تغيير ما يظهر من الصفحة حسب وضع المستخدم و بالتكامل مع نظام ASP.NET القياسي لإدارة حسابات المستخدمين.

Moayad Mardini,
MSDN Forums Moderator

خبير  أحمد عزالدين مشاركة 6

السلام عليكم

بالظبط اخى مؤيد فان ما تقصده صحيح تماما

فيمكننا عرض بعض البيانات ليراها اي زائر للموقع أو يمكننا عرض بيانات أخرى لا تظهر الا للسمتخدمين الذي قاموا بعمل login
وكل هذا متاح لنا بسهولة كبيرة اذا استخدمنا ادوات الحماية الجديدة المقدمة في asp.net2.0 مثل اداة ال login view كما ذكرت
ولكن لاستخدام اداة ال login view فانه لابد من استخدام نظام asp.net القياسى للحماية لتكامل الاداة معه

مثال: (بفرض انك جهزت نظام حماية قياسى مسبقا)
يمكننا تنفيذ ذلك بالاداة عن طريق عمل تخصيص للـ templates التى توفرها لنا الاداة والاداة توفر نوعين من ال templates
احدهما يسمى LoggedInTemplate ويوضع فيه الادوات والبيانات التى تظهر للمستخدمين المسجلين والاخر
يسمى AnonymousTemplate وهو يستخدم لنضع بداخله اي بيانات تظهر لجميع المستخدمين بالاضافة لزوار الموقع

انظر المثال الاتى من مكتبة ال MSDN
You can display different information to anonymous and logged-in (authenticated) users by including a LoginView control on the page. The LoginView control includes two templates: one for displaying information to anonymous users, and the other for displaying information to logged-in users. (You can also include templates based on role names using the RoleGroups property.)The control automatically determines whether a user is authenticated and renders the appropriate template.

To display different information to anonymous and logged-in users
Place a LoginView control on your page.

In the control, create a LoggedInTemplate, and in the template, create content that should be visible only to authenticated users.

In the control, create a AnonymousTemplate, and in the template, create the content that should be visible to users who have not logged in.

Code Example





                  FormatString ="Welcome, {0}" />



      NavigateUrl="~/MemberPages/ChangePassword.aspx">
      Change Password




        CreateUserText="Create a new user..."
        CreateUserUrl="~/Register.aspx" 
        PasswordRecoveryUrl="~/Recovery.aspx" 
        UserNameLabelText="E-mail address:" />


:

أحمد عزالدين
طالب دراسات عليا
جامعة كالجري

خبير مدير وسام البهنسي مشاركة 7

شكراً أحمد على المثال! لقد أصبحت الصورة واضحة جداً لي الآن...

وسام البهنسي
مبرمج في إنفيديا وإنفريمز