شرح MemberShip و RoleManager

TNZ187

Member
سلام به همه دوستان .
من قصد دارم با کمک سایر دوستان ، یک توضیح نسبتا مناسب و کاربردی در مورد MemberShip , RoleManagment در Asp.net 2 را شروع کنم . البته همه می دونیم که دات نت 3.5 کارهای امنیتی رو راحت تر کرده ولی من دات نت 2 رو توضیح می دم

چند تا نکته . دوستان سعی کنند که در این بخش سوال نپرسند و دوستانی که لطف می کنند و مطالب آموزشی قرار می دهند ، ارتباط با موضوع اصلی رو در نظر داشته باشند . :wink:

اگر مطلبی نقص یا خطا داشت ، دوستان متخصص حتما و حتما اصلاح کنند . :)

برای شروع :

دات نت 2 دارای یک سیستم یک پارچه برای کار با بانکهای Sql است . علاوه بر این سیستم ، سیستم امنیتی تحت وب دات نت ( Asp.net ) دربردارنده یک مجموعه تمام عیار برای کار با یوزرهای یک سایت است . این سیستم به صورت خلاصه از چند بخش تشکیل شده :
1 - سیستم مدیریت کاربران
2 - سیستم مدیریت نقش های کاربران

هرکدام از بخش های فوق خود دارای بخش های متعددی هستند و کارهای متفاوتی انجام می دهند .

مدیریت کاربران یا Membership
این بخش از سیستم امنیتی کارهای زیر را برای شما انجام می دهد
1 _ اضافه و حذف کردن کاربران
2 _ ذخیره کردن اطلاعات کاربران مثل : ایمیل ، نام ، نام خانوادگی ، تاریخ عضویت ، آخرین تاریخ فعالیت و ... .
3 _ لاگین کردن کاربران که کاربردهای مختلفی می تواند داشته باشد
4 _ اجازه تغییر پسورد به کاربران
5 _ ایجاد شناسه های منحصر به فرد برای کاربران که کار را برای نقش بندی کردن و مدیریت دسترسی کاربران راحت و هموار می کند .
6 _ به شما این قابلیت را می دهد که بتوانید سیستم فوق را تغییر دهید تا مطابق با نیاز های شما شود .

نکته : مایکروسافت یک سری صفحات با نام Administartion دارد که احتمالا تا به حال دیده اید . برای الگو گیری از آن ها می توانید به پوشه WINDOWS\Microsoft.NET\Framework\v2.0.50727\ASP.NETWebAdminFiles مراجعه کنید .

منتظر بخش های بعدی باشید . :wink:
 

zorig4fun

Member
مرسی از اینکه بحث را شروع کردید
اطفاقا دیروز میخواستم آموزش بزارم ولی به علت کمی وقت پشیمان شدم

ممبر شیپ پروایدر قسمتی میباشد از فریمورک 2 که کاملا قوی و انعطاف پذیر میباشد.

برای شروع ما در وبسایت خود به website>ASP.NET Configuration رفته در اینجا یک پنجره باز میشود که قسمتی به نام Security دارد وارد آن شده و مشاهده میکنیم که در قسمت Users نوشته The current authentication type is Windows. این به صورت پیشفرض میباشد و تنها افرادی در این حالت دسترسی به لاگین سایت خواهند داشت که بر روی سیستمی که وبسایت بر روی آن کار میکند فعالیت کنند. یعنی اینکه افراد دیگر از طرق اینترنت به آن دسترسی نخواهند داشت. برای اینکه بتوان اجازه دسترسی به تمام کاربرانی که از جاهای دیگر به سایت وارد میشوند بدهیم وارد Select authentication type شده و گزینه From the internet را انتخواب میکنیم و دکمه Done را میفشاریم.

با این کار سیستم Security فعال میشود و آماده گرفتن کاربر خواهد بود. تا اینجا ما یک سیستم لوگین به این راحتی درست کردیم و پنجره را میبندیم و به ویژوال استودیو برمیگردیم تا ببینیم چه رویدادهائی انجام شده.

تغییر خاصی مشاهده نمیشه ولی با کلیک بر روی دکمه ریفرش در سلوشن اکسپلورر میبینیم که در پوشه App_Data یک دیتابیس به نام ASPNETDB.MDF برای ما به پرژه اظافه شده این دیتابیس به صورت پیشفرض نامگذاری شده و در پوشه پیشفرض قرار دارد که در آینده اگر وقت شد در مورد انتقال آن به سرور صحبت خواهیم کرد.

مورد اصلی که این سیستم را فعال میسازد را در وب کانفیگ خواهیم یافت برای اینکه با کدها آشنا شوید وب کانفیگ را باز میکنیم.

مورد جالب اینکه ما هیچ کانکشنی نمیبینیم این به دلیل این میباشد که فریم ورک 2 به صورت پیشفرض خودش میداند که که اسم دیتابیس چیست و کجا قرار دارد.

مورد بعدی اینکه تگ <authentication mode="Forms" /> را میبینیم که ایجاد شده که اگه یادتون باشه ما authentication را تغییر دادیم تا کاربران از طریق کامپیوتر های دیگر از این سیستن استفاده کنند.

خوب حال سیستم راه اندازی شده شما نیتوانید از Toolbox ابزارهای Login را در صفهات خود استفاذه کنید.


در درست بعدی سعی میشه مقداری بیشتر در مورد انتقال دیتابیس صحبت بشه.

سوالی بود بپرسید.
 

zorig4fun

Member
در درس گذشته ما سیستم را راه اندازی کردیم ولی اشکالاتی موجود میباشد و آن امنیت سیستم میباشد دیتابیس ما در روت وبسایت قرار دارد که هر هکری به راحتی میتواند به آن دسترسی پیدا کند و دیتابیس فاقد هرگونه یوزر نیم و پسورد میباشد که خود مشکل ساز میباشد. در این ذرس میخواهیم دیتابیس را به یک SQL Server انتقال دهیم تا امنیت آن بالا رود.

برای این کار ما دو روش را پیش روی داریم روش اول اینکه دیتابیس موجود را با اطلاعات داخل آن به SQL Server انتقال دهیم و یا روش دوم یک دیتابیس جدید درست کنیم.

روش اول:

از طریف ویندوز به پوشه ای که پرژه در آن وجود دارد میرویم و App_Data را پیدا کرده در آنجا ما دو فایل خواهیم یافت به نامهای ASPNETDB و aspnetdb_log این دو فایل درواقع همان دیتابیس ما میباشند آنها را کپی گرفته و به SQL Server رفته و Attach میکنیم. طرقه Attach کردن هم راهت میباشد در SQL Server ما روی Databases راست کلیک کرده و Attach را انتخواب میکنیم. در اینجا پنجره ای باز میشود و با کمک دکمه Add مسیر دیتابیس را مشخص میکنیم و اگر لازم بود اسم را نیز عوض کرده (در Attach As ) و OK را میزنیم. دیتابیس ما انتقال یافته و آماده عملیات بعدی میباشد.

روش دوم:

در روش دوم ما یک دیتابیس میسازیم که کار سختی به نظر میرسد زیرا میبایست تمام جداول ساخته بشه و تمان تریگر ها و پرسیجر ها به آن اضافه بشه که دفت بالائی را میخواهد ولی نگران نباشید پون فریم ورک 2 کار ساده ای را برای شما در نظر گرفته است براس این کار موارد ریل را انجام دهید:
به آدرس ذیل رفته و فایل aspnet_regsql را اجرا کنید.
C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
یک صفحه باز شده و ویزارد را دنبال کنید تا جداول ممبرشیپ پروایدر را برای شما درست کند. ویزارد ساده میباشد و فقط در مرحله 3 شما باید آدرس سرور را داده و دیتابیسی که عملیات بر روی آن میبایست پیاده شود را مشخص کنید. اگر دیتابیس جدید میخواهید میبایست از اول آن را درست کرده باشید و اگر از Default استفاده شود خود برنامه دیتابیس جدیدی را به نام ASPNETDB.MDF برای شما ایجاد خواهد کرد. ویزارد را تا آخر اجرا کنید و دیتابیس شما آماده مرحله بعدی میباشد.

ما تا اینجا دیتابیس را انتقال دادیم و اگر یادتان باشد در درس قبلی ما کانکشنی نداشتیم زیرا به صورت پیشفرض فریم ورک خود میدانست از کجا میبایست اطلاعات را بخواند ولی خالا دیتابیس محل اصلی خودش را از دست داده بنابر این ما میبایست دیتابیس را معرفی کنیم. برای این کار به وب کانفیگ رفته و کد کانکشن را پیدا کرده و به صورت ذیل تغییر میدهیم:

کد:
<connectionStrings>
<clear/>
		<add name="LocalSQLServer" connectionString="Data Source=آدرس سرور;Initial Catalog=نام دیتابیس;Integrated Security=True" providerName="System.Data.SqlClient"/>
</connectionStrings>

در اینجا چند مورد مهم را ذکر میکنم
اول از همه ما میبایست <clear/> کنیم زیرا با این کار به فریم ورک میگوئیم که کانکشن پیشفرض ذا ما تغییر داده ایم
مورد بعدی نام کانکشن میباشد که به صورت پیشفرض LocalSQLServer میباشد اگر نام را تغییر دهید سیستم دچار اشکال خواهد شد زیرا فقط این نام را میشناسد.(البته قابل تغییر میباشد ولی کدهای دیگری به آن میبایست اضافه شود که اگر وقت شد به آن نیز میپردازیم)
کانکشنی که من اینجا استفاده کردم تراست کانکشن میباشد یعنی بدونه یوزر نیم و پسورد که این کانکشد برای وبسایتهائی استفاده میشود که روی کاکپوتر شخصی میباشند و برای انتقال پروژه بر روی سرور واقعی کانکشن را میبایست عوض کنید که خارج از بحث ما میباشد.

خوب حالا ما دیتابیس را انتقال دادیم و مسیر دیتابیس را هم مشخص کردیم شما میتوانید محتویات داخل App_Data را پاک کنید و میبینید که سیستم با دیتابیس شما کار خواهد کرد.

موفث باشید
 

TNZ187

Member
Role Manager

سلام
با تشکر از آقای Zorig ، من از این به بعد بیشتر کلیات رو عرض می کنم ایشان بخش های عملی را.

Role Manager

رول ها دقیقا چه هستند و چه می کنند ؟

در سیستم های قدیمی و کوچک که تعداد کاربران محدود بود ، برای هر کاربر دسترسی مشخص تعریف می شد . اما با افزایش کاربران و موجودیت بخش های متفاوت ، می بایست یک نقش را تعریف کرد و به هر کاربر یک نقش را اختصاص داد . در واقع یک نقش حاوی دسترسی های مشخصی است و کاربران دیگر به جای ارتباط مستقیم با دسترسی ها با نقش ها شناخته می شوند .

سیستم رول های دات نت .

دات نت به شما امکان ایجاد و استفاده از رول های محلی را می دهد . در واقع رول ها دو نوع هستند ، رول های منطقه ای و رول های لایه ای . در رول های لایه ای ، رول ها می توانند دارای دسترسی هایی از کم تا حداکثر باشند ، ولی در رول های منطقه ای برای هر منطقه رول تعریف می کنند . البته این روش دارای انعطاف پذیری بیشتری است و می توان بعد از طراحی سایت نیز نقش ها را تغییر داد ، بر خلاف سیستم لایه ای که تغییر نقش ها پس از طراحی سخت است .

نحوه تعریف دسترسی و عدم دسترسی

این کار به صورت پیش فرض در فایل Web.Config انجام می شود . مثلا
کد:
<configuration>
   <location path="memberPages">
       <system.web>
            <authorization>
               <allow roles="members" />
               <deny users="*" />
            </authorization>
          </system.web>
        </location>
   <!-- other configuration settings here -->
<configuration>

به جای کار فوق می توان در هر پوشه یک فایل Web.Config قرار داد و تنظیمات مربوط به آن پوشه را درون همان فایل قرار داد تا فایل اصلی خیلی شلوغ نشود .

نحوه اختصاص دادن یک رول به یک کاربر را فکر می کنم آقای Zorig در ادامه آموزش های خودشان مطرح کنند . :wink:
 

TNZ187

Member
Role Access

سلام
در توضیح قبل یک نکته جا مونده بود که چون نسبتا زیاد بود جدا کردم .

قوانین دسترسی و عدم دسترسی در فایل Web.Config به این صورت است .

Allow به معنای داشتن دسترسی
Deny به معنای عدم دسترسی

roles = نقشهایی را که این حکم شامل آن ها می شود بیان می کنند .
Users = قالبا دو مقدار دارد : 1 _ ؟ = کاربرهایی که شناخته نشده ( لاگین نشده ) هستند 2 _ * = به معنای همه کاربران است .

طبق توضیحات فوق ،
کد:
<allow roles="members" />
یعنی تنها کاربرانی با نقش members بتوانند عبور کنند و
کد:
<deny users="*" />
یعنی که هیچ کس نتواند عبور کند .

نکته : دات نت قوانین را از بالا به پایین می خواند ، یعنی اگر شما جزء Members بودید عبور می کنید وگرنه دات نت قانون دوم را خوانده و اجرا می کند یعنی اینکه هرکسی می خواهی باشی باش، دسترسی نداری . :wink:
 

zorig4fun

Member
خلاصه مطالب بالا این را میرساند که یکسرس کاربر در سایت ما ثبت نام کردن و ما میخواهیم که کاربران را دسته بندی کنیم به گروه های کاربری متفاوت مثلا کاربری که ثبت نام نکرده کاربری که ثبت نام کرده و کاربری که ثبت نام کرده ولی نام کاربری آن فعال نشده و یا توسط مدیر دسترسی آن به سایت محدود شده و مدیران بخشها و مدیر کل و ..... که بستگی به ساختار پرژه و نیازمندی های پرژه ای که مینویسید داره.

درکل ما با Role تصمیم میگیریم که چه کاربری چه اختیاراتی دارد و از چه قسمتهائی میتواند بازدید کند یا استفاده کند.

برای فعال کردن Role در پروژه خود ما به website>ASP.NET Configuration رفته و وارد قسمت Security میشویم. در قسمت Roles میبینیم که به صورت پیشفرض Roles are not enabled به ما نمایش داده میشود که حاکی از غیر فعال بودن آن میباشد. برای فعال کردن نا روی Enable roles کلیک کرده و میبینیم که Existing roles: 0 نمایش داده میشود که بیانگر تعداد گروه بندی کاربری میباشد.

صفحه را ببندید و به وب کانفیگ برویم ببینیم چه اطفاقی افتاده. در وب کانفیگ تگی اضافه شده که <roleManager enabled="true" /> میباشد که به فریم ورک میگوید که role در وبسایت فعال میباشد.

خوب حالا مثالی میزنیم تا بیشتر با کار این روش آشنا شوید که مو به مو تقیب خواهیم کرد که چه اطفاقی کجا روی میدهد.

اول به website>ASP.NET Configuration رفته و وارد قسمت Security میشویم. در اینجا Create or Manage roles را کلیک کرده و به صفحه جدید وارد میشویم. در اینجا ما یک اسمی برای رول خود انتخواب میکنیم مانند (کابر عضو) و Add Role را میزنیم و یک دسته بندی برای کاربران تا حالا ایجاد کردیم و برمیگردیم به Security و به وسیله Create user یک کابر به هر نامی ثبت نام میکنیم. در هنگام ثبت نام در سمت راست Roles را مشاهده میکنیم که با انتخواب نوع کاربر میتوانیم سطح دسترسی وی را مشخص کنیم که برای هر کاربر میتوان تعدادی دسترسی انتخواب کرد یا اینکه دسترسی مشخص نکرد. که ما اینجا یک رول داریم و آن را به کاربر جدید اختصاص میدهیم نام کابری را ثبت میکنیم. صفحه را ببندید ببینیم درواقع با این کار خود چه کاری را انجام دادیم.

این کار ما کدی به وب کانفیگ اضافه نکرده و تغییراتی در دیتابیس صورت گرفته برای همین یک مگاهی به دیتابیس میندازیم.
در جدول aspnet_Roles میبینیم که نام رول ما ثبت شده و در جدول aspnet_UsersInRoles آیدی رول موجود را برای آیدی کاربر قرار داده. بنا بر این هر کاربری که براش رول در نظر میگیریم در دیتابیس ذخیره میشه.
خوب تا حالا فقط رول را درست کردیم حالا میریم که از آن استفاده کنیم. برای این کار دوباره به website>ASP.NET Configuration رفته و وارد قسمت Security میشویم در اینجا Access Rules را میبینیم وارد Create access rules میشویم و در این صفحه در سمت چپ پوشه های موجود در پروژه خود را میبینیم اگر پوشه ای ندارید برگردید و یکی درست کنید و صفحه ای را در آن قرار دهید و برگردید. با کلیک کردن بر روی پوشه صفحه ری فرش شده و به معنای این است که آماده اختصاص دادن دسترسی به این پوشه میباشد. در وسط صفحه چهار گزینه میبینید که گزینه اول کاربرانی که داخل رول هیتند را انتخواب میکند و رول را میتوانید انتخواب کنید گزینه دوم کابر خاصی را میتوانید به نام انتخواب کنید. گزینه سوم تمام کابران عضو را در نظر میگیرد و گزینه چهارم تمان کاربرانی که عضو نیستند یا ایمکه لوگین مکردن را در نظر میگیرد.
در سمت راست Allow اجازه میدهد و Deny اجازه نمیدهد که مورد انتخواب شده در وسط به پوشه دسترسی داشته باشد به معنای تمان فایلها و صفهات در این پوشه میباشد.
حالا پوشه را انتخواب کنید در وسط گزینه اول را انتخواب کنید و نوع گروه کاربری را مشخص کنید بعد در سمت راست Allow را بزنید و OK را کلیک کنید. با این کار ما گروه کابری کابر عضو را که قبلا ایجاد کردیم را بهش اجازه میدهیم که از صفحات موجود در این پوشه استفاده کند حالا ما میبایست کابران دیگر را محدود کنیم برای این کار دوباره به Create access rules رفته و پوشه را انتخواب کرده و مورد سوم را در وسط انتخواب میکنیم و Deny را برایش در نظر میگیریم و همینطر برای Anonymous users نیز همین کار را تکرار میکنیم.صفحه را میبندیم و میریم به پروژه تا ببینیم چه تغییراتی صورت گرفته.

سلوشن اکسپلورر را ری فرش میکنیم میبینیم که یک فایل جدید وب کانقیگ در آن پوشه ایجاد شده که آن را باز کنید کدهای ذیل را خواهید دید.

کد:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.web>
        <authorization>
            <allow roles="کابر عضو" />
            <deny users="*" />
            <deny users="?" />
        </authorization>
    </system.web>
</configuration>

کدها خیلی ساده هستند و در وسط فقط * به معنای دیگر کاربران و ? به معنای کابران میهمان میباشد که لوگین نکردن.

کدها را هم میتوانید دستی بنویسید و موردی که خیلی به کار میاید این است که شما صفحه ای دارید که کاربر لوگین میکند یا عضو میشود یا اینکه پسورد خود را عوض میکند و این صفحه در منو لینک داده شده است (منوئی که از سایت مپ استفاده میکند) و وقطی کاربر لوگین کرده نیازی به صفحه عضویت یا لوگین نداره ولی نیاز به عوض کردن پسورد داره و میخواهید که منو با ورود و خوروج کاربر تغییر کند برای همین نمیشه این صفحات را داخل پوشه های متعدد قرار داد و میخواهید که صفحه روی روت اصلی باشد برای این کار ما رول را میبایست فقط به یک صفحه خاص اختصاص دهیم. برای این کار ما از وب کانفیگ واقع در روت اصلی استفاده میکنیم که کد آن به صورت ذیل میباشد.

کد:
</system.web>

  <location path="EditPost.aspx">
	<system.web>
	  <authorization>
		<deny users="?" />
	  </authorization>
	</system.web>
  </location>

</configuration>

در اینجا ما کاربران میهمان را از دسترسی به صفحه EditPost.aspx باز میداریم البته تگهای </system.web> و </configuration> جزء کدها نمیباشد و فقط گزاشتم که بدانید کجا این کدها را وارد کنید.

امیدوارم که آموزش جالبی شده باشد برای دلگرمی که بدانیم مخاطب داریم و ادامه بدبم از دکمه تشکر هم استفاده میتوانید کنید.
 

zorig4fun

Member
اضافه بر بحث
درکل ممبر شیپ پرووایدر همانطود که گفتن کاملا انعطاف پذیر میباشد ما در اینجا فقط خلاصه ای را برای شما در نظر گرفتیم وگرنه موارد دیگری نیز هست که دانستن آن خالی از لطف نیست.
ممبر شیپ پروایدر را شما میتوانید بر روی دیتابیسهای دیگر مانند Access و Mysql نیز پیاده کنید که نیازمند به نوشتن کلاس میباشد که بحث طولانی دارد و من خود به شخصه سواد تدریس را ندارم.
میتوان از یک دیتابیس برای سایتهای متفاوت استفاده کرد بدونه اینکه تداخلی در کاربران سایتها ایجاد شود فقط کافیست که نام اپلیکیشن را عوض کنید و در وب کانفیگ خر سایت اپلیکیشن مخصوص را تعریف کنید.
جداول دیگری نیز میتوان برای جمع کردن اطلاعات بیشتر از کاربر به جداول موجود اضافه کرد و هماهنگ مرد که با آنها کار کنند.
مورد جالب دیگر اینکه اگر از جداول ممبر شیپ پروایدر نمیخواهید استفاده کنید یا اینکه دیتابیس قدیمی خود را با کاربران بخواهید استفاده کنید باز با نوشتن کلاس امکانپذیر میباشد.
یک قسمت به نام پروفایل در جداول موجود میباشد که با فعال کردن آن میتوان اطلاعات بیشتری را از کاربر ذخیره کرد.
و موارد دیگر که به ذهن من نمیرسه

در جلسه بعد در مورد تغییر ساختاری برای ثبت نام صحبت خواهد شد که چگونه پسورد را به اندازه و فرمت دلخواه در بیاوریم و یا برای ایمیل به کاربر اجازه بدهیم که ایمیل جدید باشد یا خیر صحبت خواهد شد.
 

TNZ187

Member
کلاس ها

سلام
فکر می کنم بهتر باشه کلاس هایی که در هر بخش مؤثر هستند رو بشناسیم .
Membership از کلاس های زیر کمک می گیره :
MemberShip ; MembershipProvider ; MembershipUser ; MembershipUserCollection

MemberShipProvider : این کلاس تمام ارتباط های سیستم با پایگاه داده رو به عهده داره . مثلا برای وارد کردن اطلاعات به پایگاه داده چند نوع متد داره .
MemberShip : این کلاس وظیفه داره که کاربران را با کلاس بالایی ارتباط دهد . این کلاس تصمیم می گیره که کدام متد را باید با کاربر ارتباط بده .
MembershipUser : هر User را تعریف می کنه . در واقع یک کلاس است که اطلاعات مربوط به هرکاربر را که از پایگاه داده دریافت می شود دسته بندی می کنه که شما راحت تر به این اطلاعات دسترسی داشته باشید .

خوب حالا معلوم می شه که اگه شما بخواهید ، یک دیتابیس که خودتون تعریف کردید و یا بهتر بگم ، سیستم را مطابق با میل خودتون تغییر بدهید ، می دانید که کدام کلاس را باید از ابتدا بازنویسی و تغییر دهید .
یک کورس کامل از آموزش Membership و نحوه Implement کردن کلاس های آن . :wink:
http://msdn2.microsoft.com/en-us/library/tw292whz.aspx
مرحله بعدی کار با رول ها است .
 

TNZ187

Member
Roles

سلام
در این بخش می خواهم به توضیحات اجمالی در مورد Role ها و کلاس های موثر در این سیستم بدهم .
به صورت کلی در سیستم رول های دات نت این کلاس ها ایفای نقش می کنند :
UrlAuthorizationModule ; RoleProvider ;RolePrincipal ;RoleManagerModule ; Roles

RoleProvider : این کلاس برای برقراری ارتباط سیستم با پایگاه داده طراحی شده است ( همانند MembershipProvider )
Roles : وظیفه برقراری ارتباط میان کاربران و کلاس بالا را بر عهده دارد .
UrlAuthorizationModule : این همان کلاسی است که هر آدرس را با دسترسی های موجود در آن بررسی می کند و نقش ها را با آن ها مقایسه کرده و تصمیم می گیرد که به شما اجازه عبور بدهد یا ندهد .
RolePrincipal : کلاسی که اطلاعت شناسایی کننده یک کاربر رو که می بایست با شیء HttpContext همراه شود در بر دارد . مثل نام کاربر یا تاریخ انقضاء گذرنامه کاربر برای دسترسی به سایت .
RoleManagerModule : یک HttpModule است که بعد از رویداد postAuthentication رخ می دهد و شیء RolePrincipal هر کاربر را با شیء HttpContext همراه می کنه .
( RolePrincipal حکم یک پاسپورت را برای کاربران دارد . هرکسی که آن را نداشته باشد مشخص می شود که هنوز لاگین نفرموده )
این هم یک کورس کامل دوره آموزشی این بخش . http://msdn2.microsoft.com/en-us/library/9ab2fxh0.aspx
 

TNZ187

Member
مثال

سلام
برای روشن تر شدن قضیه می خواهم یک نمونه مثال برای Implement کردن از کلاس های بالا را کم توضیح دهم

مثلا کلاس MemberShipProvider :
قبلا مطرح کرده بودیم که اگر می خواهید ساختار خودتان را برای پایگاه داده داشته باشید و یا با یک پایگاه داده که Sql نیست کار کنید ، می بایست این کلاس را تغییر دهید ( البته صراحتا نگفته بودم ولی شما حتما متوجه شده بودید :wink: )
برای کسی که تنها می خواهد از یک پایگاه غیر Sql با همان ساختار دات نت استفاده کند، تنها کافی است که کلاس MemberShipProvider را ارث ببرد و نوع Connection و Command ها را مطابق با خواسته خودش تغییر دهد ولی کسی که می خواهد ساختار را تغییر دهد ، می بایست بعد ارث بری ، متدهای خودش را اضافه کرده و متدهای دیگر را بسته به نیازش ویرایش کند .
تمام این مطالب در لینکی که گذاشته بودم موجود بود ، فقط خواستم یک توضیح فارسی هم دور هم داشته باشیم . :)

بعد از اینکه کلاس خودتان را آماده کردید ، در فایل Web.Config در بخش زیر تغییرات را اعمال کنید .
کد:
    <membership defaultProvider="name of your new pattern in add section" userIsOnlineTimeWindow="15">

      <providers>

        <add 
          name="any name for this membership pattern" 
          type="Full dotted name of your class. like Mahdy.Tnz.Provider" 
          connectionStringName="your connection"
          enablePasswordRetrieval="true"
          enablePasswordReset="true"
          requiresQuestionAndAnswer="true" 
          writeExceptionsToEventLog="true" />

      </providers>
    </membership>

  </system.web>
</configuration>

توضیح گزینه های استفاده شده :
enablePasswordRetrieval : امکان بازیابی رمز عبور وجود داشته باشد یا نه .
requiresQuestionAndAnswer : شما از سوال و جواب برای کاربرانی که پسوردشان را فراموش کرده اند استفاده می کنید ؟
writeExceptionsToEventLog : خطا ها را در قسمت Log ها بنویسد یا نه . ( برای من که خیلی فرق نداره :) )

قسمت بعدی را اختصاص می دم به تنظیمات فایل web .config در مورد Membership
( از این جا به بعد از نظرات دوستان هم درباره ادامه مبحث استفاده کنیم خیلی خوب می شه ، چون من نمی دانم چه قسمت هایی برای دوستان پرکاربرد تر است تا آن را توضیح دهم. تا هفته بعد خدا حافظ . :sad: )
 

alirezamx

New Member
من تمام این کارا را کردم یعنی جداول و Sp ها رو به Db خودم اضافه کردم.حالا من خودم یه جدول User دارم که اطلاعات اضافی کاربرا رو نگه می داره.چه جوری میشه وقتی با کنترل های Login یه کاربر جدید ثبت نام میکنه هم به خود دیتا بیس Asp و هم به جدول خودم اضافه بشه و چه جوری وقتی با کنترل های Login (مثل کاربری که الان Online هست) کار میکنم و از رکورد اون کاربر استفاده میکنم بتونم بفهمم کدوم کاربر از جدول خودمه و بقیه اطلاعاتشو از اون بخونم.؟
 
آقا یه سوالی داشتم .
اگر بخواهیم در جداول membership به جز فیلدهای خود membership مانند نام کاربری و پسورد و ایمیل و ... ، خودمان یک یا چند فیلد دلخواه هم اضافه کنیم جهت ذخیره دیگر مشخصات یک کاربر ، یا بطور خلاصه اینکه : اگه بخواهیم سیستم membership را سفارشی کنیم ، چکار باید بکنیم ؟ ؟ ؟
 

khz-web1

Active Member
آقا یه سوالی داشتم .
اگر بخواهیم در جداول membership به جز فیلدهای خود membership مانند نام کاربری و پسورد و ایمیل و ... ، خودمان یک یا چند فیلد دلخواه هم اضافه کنیم جهت ذخیره دیگر مشخصات یک کاربر ، یا بطور خلاصه اینکه : اگه بخواهیم سیستم membership را سفارشی کنیم ، چکار باید بکنیم ؟ ؟ ؟


من هم دقیقا هیمن مشکل رو دارم ...........

با تشکر
 

zorig4fun

Member
سلام
مرسی از اینکه بابت مقالات تشکر کردید
در مورد اضافه کردن جدول به ممبر شیپ من خودم نمیتونم تدریس کنم ولی بگید به چه زبانی میخواهید کدهای کلاس نوشتن را براتون میزارم

درکل یک کلاس بالای 250 خط باید بنویسید تا یک جدول با 3 مورد بتوانید به اطلاعات کاربر اضافه کنید.

در ممبر شیپ پروایدر یک چیزی به همین منظور موجود میباشد به نام پروفایل که بزودی نوشتن کدها را براتون میزاذم و میگم چگونه ازش استفاده کنید.
 

zorig4fun

Member
خوب در جلسه گذشته گفتیم که مقداری از تنظیمات پیشفرض ممبر شیپ را عوض خواهیم کرد.

به طور پیشفرض کاربران ما میبایست پسوردی انتخواب کنند با 7 حرف و یک علامت مثل علامت سوال یا درصد یا ... یا اینکه میبایست سوالی و جوابی را برای حفاضت بیشتر نام کاربری وارد کنند. اما اگر ما بخواهیم تنظیمات را عوض کنیم چه باید کرد؟

جواب سوال خیلی راحت میباشد ما میبایست در وب کانفیگ ممبر شیپ پروایدر را کلیر کنیم و کدهای خودمان را بنویسیم.
کد:
<membership> 
<providers>

<clear/> 
<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"

connectionStringName="LocalSqlServer"

enablePasswordRetrieval="false"

enablePasswordReset="true"

requiresQuestionAndAnswer="false"

applicationName="/"

requiresUniqueEmail="true"

passwordFormat="Hashed"

maxInvalidPasswordAttempts="5"

minRequiredPasswordLength="5"

minRequiredNonalphanumericCharacters="0"

passwordAttemptWindow="10"

passwordStrengthRegularExpression=""/> 
</providers>

</membership>

این کدها را داخل <system.web> قرار میدهیم و مواردی را که مهم میباشد براتون توظیح میدهم

اول از همه میبایست تگ <clear/> را استفاده کنیم که ممبر شیپ بداند از حالت پیشفرض خارج شدیم.

requiresQuestionAndAnswer این مورد سوال و جواب را فعال یا غیر فعال میکند
requiresUniqueEmail این مورد به کاربر اجازه میدهد که از یک ایمیل به دفعات استفاده کند یا نکند.
minRequiredPasswordLength این مورد تعداد حروف رمز عبوری را مشخص میکند.
minRequiredNonalphanumericCharacters این مورد تعداد علایمی که کاربر میبایست در رمز عبوری استفاده کند را مشخص میکند.

شما میبایست فقط کدها را به وب کانفیگ اضافه کنید و نیازی به تغییر خود قسمت ثبت نام و تغییر رمز عبوری ندارید و موارد اضافه خود به خود نمایش داده نمیشوند.

موفق باشید
امیدوارن این درس کوتاه برای شما مفید واقع شده باشد
 
سلام
مرسی از اینکه بابت مقالات تشکر کردید
در مورد اضافه کردن جدول به ممبر شیپ من خودم نمیتونم تدریس کنم ولی بگید به چه زبانی میخواهید کدهای کلاس نوشتن را براتون میزارم

درکل یک کلاس بالای 250 خط باید بنویسید تا یک جدول با 3 مورد بتوانید به اطلاعات کاربر اضافه کنید.

در ممبر شیپ پروایدر یک چیزی به همین منظور موجود میباشد به نام پروفایل که بزودی نوشتن کدها را براتون میزاذم و میگم چگونه ازش استفاده کنید.

آقا ممنون که این نکته رو گفتید .
حداقل فهمیدیم برای اضافه کردن فیلد اضافه به Membership باید کلاسش رو بنویسیم .
من از زبان VB.NET استفاده میکنم .
امیدوارم هر چه زودتر کدهای کلاسش رو برامون بزاری .
البته یه اعترافی بکنم : توی این انجمن تا حالا هیشکی به اندازه شما فعال و سریع نبوده .
بازم ممنون از لطفتون .
امیدوارم جواب بقیه سوالهامو که خیلی وقته جوابی براشون پیدا نکردم ، با یاری شما به جایی برسونم . :)
 

zorig4fun

Member
خوب تا اینجا موارد کلی را در نظر گرفتیم و حالا شاید ما نیاز داشته باشیم که جنسیت کاربر را بدانیم (مثلا در سایتهای دوست یابی) یا نام کاربر تاریخ تولد کشور شهر و ... که ما بتوانیم کارائی بهتری در سایت خود داشته باشیم برای این کار نثبت به موقعیت و نوع کارائی سایت روشهای متفاوتی موجود میباشد که نیازمند به دقت زیاد و سواد بالای برنامه نویسی برای نوشتن کلاسهای متفاوت دارد که برای تازه کارها دلسرد کننده میباشد.

ماکروسافت در ممبر شیپ پروایدر خود جدولی برای این کار در نظر گرفته به نام aspnet_profile که اطلاعات اضافه کاربر که در جداول دیگر موجود نمیباشد را در خود ذخیره میکند. ایم جدول بسیار ساده میباشد و در نگاه اول ما مشاهده میکنیم که پنج تا بیشتر سطون در این جدول موجود نمیباشد ولی ما تغریبا هرچقدر که بخواهیم مینوانیم اطلاعات از هر کاربر را که بخواهیم در این جدول قرار دهیم.

برای این کار ما با وب کانفیگ کار خواهیم کرد و موارد مورد نیاز را در وب کانفیگ (که حالت پیشفرض این مورد غیر فعال میباشد) معرفی کرده و در جلسه بعدی اگر وقت شد بیشتر در مورد نوشتن و خواندن اطلاعات کاربر صحبت خواهیم کرد.

برای شروع وب کانفیگ را باز کرده و تگهای ممبر شیپ پروایدر را پیدا میکنیم و کدهای ذیل را زیر آن اضافه میکنیم تا پروفایل کاربر را فعال کنیم (این کدها میبایست در داخل <system.web> باشند ولی برای خوانا تر شدن کدها زیر ممبر شیپ مینویسیم).

کد:
<profile enabled="true">
	<properties>
		<add name="Country" type="string"/>
		<add name="Gender" type="string"/>
		<add name="Age" type="Int32"/>
	</properties>
</profile>

در اینجا کاری که ما کردیم این است که
در خط اول پروفایل را به حالت فعال در آوردیم
در خط دوم properties را تعریف کردیم تا نوع اطلاعات را به پروژه معرفی کنیم
در خط سوم ما یک نوع داده ای string معرفی کردیم به نام Country که کشور کاربر را در خود ذخیره خواهد کرد.
در خط چهارم ما یک نوع داده ای string معرفی کردیم به نام Gender که جنسیت کاربر را در خود ذخیره خواهد کرد.
در خط پنجم ما یک نوع داده ای Int32 معرفی کردیم به نام Age که سن کاربر را در خود ذخیره خواهد کرد.

و موارد دیگری که شما نیاز دارید را میتوانید معرفی کنید.

به این سادگی میتوان پروفایلی برای کاربر در نظر گرفت و در جلسه بعدی ما میپردازیم به اینکه چگونه یک لوگین ساده درست کنیم که در موقع ثبت نام اطلاعات را از کاربر بگیرد و در دیتابیس ذخیره کند و چگومه برای کاربر یک صفحه برای نمایش پروفایل بسازیم.

منتظر باشید برای دلگرمی و اینکه بدانیم مخاطب داریم دکمه تشکر یادتون نره
 

zorig4fun

Member
آقا ممنون که این نکته رو گفتید .
حداقل فهمیدیم برای اضافه کردن فیلد اضافه به Membership باید کلاسش رو بنویسیم .
من از زبان VB.NET استفاده میکنم .
امیدوارم هر چه زودتر کدهای کلاسش رو برامون بزاری .
البته یه اعترافی بکنم : توی این انجمن تا حالا هیشکی به اندازه شما فعال و سریع نبوده .
بازم ممنون از لطفتون .
امیدوارم جواب بقیه سوالهامو که خیلی وقته جوابی براشون پیدا نکردم ، با یاری شما به جایی برسونم . :)

دوست عزیز من برای شما و دیگر دوستان لینک پروژه که آقای کریست پر نوشتن را میزارم ولی انتظار نداشته باشید که بیام 550 خط کلاس را توضیح بدم شما خودتون هم باشید این کار را نمیکنید.

http://download.microsoft.com/downl...bb0-b3ae55c97732/VB-ASP-ProfileProvide_vb.zip

http://download.microsoft.com/downl...b0-b3ae55c97732/CS-ASP-ProfileProvider_cs.zip

امیدوارم بتوانید استفاده کنید
 

zorig4fun

Member
این را هم اظافه کنم که اگر بخواهیم از جداول ممبر شیپ پروایدر ایتفاده نکنیم یا اینکه از جداول دیتابیس قدیمی خود استفاده کنیم که کاربران سایت قدیمی در آن هستند نیز آقای کریست پر پروژه ای نوشتند که امیدوارم خوشتون بیاد و بتوانید استفاده کنید.

http://download.microsoft.com/downl...4772f24def1f/VB-ASP-MembershipProvider_vb.zip

http://download.microsoft.com/downl...4772f24def1f/CS-ASP-MembershipProvider_cs.zip


در آخر اینکه من یکسری ویدئو آموزشی با تمان فایلهای سرس که این دو آموزش را نیز در بر دارد را برای آقای vb_bmw فرستادم اگر خواستید با قیمت بسیار مناسب برای شما خواهد فرستاد. که توضیحات کامل به زبان انگلیسی برای این دو بخش آخر را آقای کریست پر میدهد.

موفق باشید
 

zorig4fun

Member
خوب انگاری ما خیلی مخاطب داریم و آموزش جالب شده

لطفا در این مورد به من در یاهو پی ام ندید و سوالات خود را در اینجا یا با ایجاد یک تاپیک جدید بپرسید البته اگر سایت ملورین را بتوانم کامل کنم تمان دروس با مثال و عکس برای شما میزارم چون اینجا جای این کارها نیست.

خوب در جلسه قبل ما پروفایل را فعال کردیم و داده هائی که نیاز داریم را معرفی کردیم سوالی پیش میاد که داده ها را چگونه در aspnet_profile ریخته میشود برای این کار ما پروژه ای درست میکنیم که کاربر موقع ثبت نام اطلاعاتی را وارد کند و ما اطلاعات را میگیریم و به دیتابیس انتقال میدهیم.

برای این کار ما نیاز به یک صفحه داریم که کاربر رجیستر کند صفحه را ایجاد میکنیم و کنترل CreateUserWizard را به آن اضافه میکنیم در قسمت ویو صفحه روی کنترل رفته و پنجره تنظیمات آن را باز میکنیم و Customize Creat User Step را میزنیم در اینجا حالت پیشفرض را ما به حالت قابل ویرایش در آوردیم.
کنترلها را وارد صفحه کرده توضیحات را میدهیم و به وسیله جداول فرمت دهی میکنیم تا زیباتر بشه. برای کشور و جنسیت ما دو تا دراپ دان لیست میزاریم و برای سن کاربر یک تکس باکس قرار میدهیم که البته شما هر کنترلی که خواستید میتوانید بزارید و با ولیدیتر کنترلها تنظیم کنید تا کاربر اطلاعات نا مربوط وارد نکند مثلا به جای سن که میبایست عدد باشد کلمه وارد کند.

خوب تا اینجا فرم ما آماده میباشد و ما میبایست کدی تعریف کنیم تا اطلاعات از فرم خوانده و به دیتابیس ریخته بشه که کدهای ذیل را در کدهای سرس وارد میکنیم.
اول از همه ما CreateUserWizard را انتخواب کرده در پنجره پراپرتیز اونت را زده یکسری اطلاعت که کدام دکمه فشار داده شود و چه عملیاتی انجام شود به ما داده میشود که ما به دنبال CreatUser میگردیم و دو بار روی آن کلیک کرده و کدهای مربوط به دکمه ایجاد میشود و کدهای زیر را در بین آن اضافه میکنیم.


کد:
C#

    // CreatedUser event is called when a new user is successfully created
    public void CreateUserWizard1_CreatedUser(object sender, EventArgs e) {

        // Create an empty Profile for the newly created user
        ProfileCommon p = (ProfileCommon) ProfileCommon.Create(CreateUserWizard1.UserName, true);

        // Populate some Profile properties off of the create user wizard
        p.Country = ((DropDownList)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("Country")).SelectedValue;
        p.Gender = ((DropDownList)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("Gender")).SelectedValue;
        p.Age = Int32.Parse(((TextBox)CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("Age")).Text);

        // Save the profile - must be done since we explicitly created this profile instance
        p.Save();
    }

کد:
VB

' CreatedUser event is called when a new user is successfully created 
Public Sub CreateUserWizard1_CreatedUser(ByVal sender As Object, ByVal e As EventArgs) 
    
    ' Create an empty Profile for the newly created user 
    Dim p As ProfileCommon = DirectCast(ProfileCommon.Create(CreateUserWizard1.UserName, True), ProfileCommon) 
    
    ' Populate some Profile properties off of the create user wizard 
    p.Country = DirectCast(CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("Country"), DropDownList).SelectedValue 
    p.Gender = DirectCast(CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("Gender"), DropDownList).SelectedValue 
    p.Age = Int32.Parse(DirectCast(CreateUserWizard1.CreateUserStep.ContentTemplateContainer.FindControl("Age"), TextBox).Text) 
    
    ' Save the profile - must be done since we explicitly created this profile instance 
    p.Save() 
End Sub

البته شاید یکم در این مورد برای شما تفاوت داشته باشه ولی با خواندن کدها متوجه میشوید که چه کاری میبایست انجام بدهید مثلا اسم کلاس یا اسامی کنترلها را باید تغییر دهید.

این درس نیز به پایان رسید و ما توانستیم پروفایل را به کاربر با چند خط کد اختصاص دهیم که شما با مطالعه کلاسها بیشتر میتوانید در این مورد مطلب جمع کنید و استفاده ببرید. در جلسه بعد ما میپردازیم به بازخوانی اطلاعات از دیتابیس.

دکمه تشکر یادتون نره موفق باشید.
 
آخرین ویرایش:

جدیدترین ارسال ها

بالا