قطعه کد لاگین کاربران با membership
دوشنبه 10 شهریور 1393 9:34 AM
سرويس های Membership و Roles در ASP.NET 2.0 (بخش اول)
تائيد كاربران و امكان استفاده آنان از پتانسيل های موجود بر روی يك سايت و يا برنامه بر اساس مجوزهای تعريف شده ، از جمله عمليات مهم در بسياری از وب سايت ها و يا برنامه های وب است . امروزه بر روی اينترنت می توان سايت های متعددی را مشاهده نمود كه كاربران را ملزم به login نموده تا پس از بررسی هويت آنان ، امكان استفاده از امكانات موجود بر روی سايت ( تمام سايت و يا بخش هائی خاص ) بر اساس مجوزهای تعريف شده ، فراهم گردد . به عنوان نمونه ، در برخی از سايت ها امكان ارسال خبر ، پيام ، مشاهده مقالات و ... صرفا" در اختيار كاربران تائيد شده گذاشته می شود .
در سناريوی فوق ما با دو چالش اساسی مواجه هستيم :
اجازه دهيد قبل از اين كه به نحوه مديريت كاربران در ASP كلاسيك ، ASP.NET 1.x و ASP.NET 2.0 اشاره نمائيم ، تعريفی داشته باشيم از Authentication و Authorization :
Authentication ، فرآيندی است كه بر اساس آن هويت يك كاربر بررسی می گردد. پس از تائيد كاربر ، اين موضوع بررسی خواهد شد كه كاربر تائيد شده مجاز به انجام چه نوع عملياتی است .
Authorization ، فرآيندی است كه بر اساس آن مشخص می گردد كاربر تائيد شده مجاز به انجام چه نوع عملياتی است .
با استفاده از فرآيندهای فوق ، پياده كنندگان می توانند يك سايت را با توجه به نوع كاربران سفارشی نمايند .
ملزومات يك سيستم مديريت كاربران به منظور تامين فرآيندهای Authentication و Authorization
ايجاد يك سيستم جهت مديريت كاربران مستلزم انجام مراحل مشابهی است :
در ادامه به بررسی امكانات ارائه شده در ASP كلاسيك ، ASP.NET 1.x و ASP.NET 2.0 در خصوص مديريت كاربران خواهيم پرداخت .
ASP كلاسيك
قبل از ASP.NET ، پياده كنندگان مجبور بودند كه علاوه بر پياده سازی تمامی مراحل فوق ، تمهيدات لازم به منظور تائيد كاربران و صدور مجوزهای لازم به منظور دستيابی به منابع موجود بر روی يك سايت و يا برنامه را انجام دهند . يكی از چالش های اصلی در اين زمينه و در هنگام درخواست يك منبع از سرويس گيرنده توسط كاربر ، حصول اطمينان از اين موضوع است كه كاربر متقاضی قبلا" تائيد شده باشد . يكی ديگر از چالش های موجود ، نحوه حفاظت برخی صفحات از دستيابی غيرمجاز است . چگونه می توان يك صفحه را بگونه ای پيكربندی نمود كه صرفا" كاربران خاصی بتوانند از آن استفاده نمايند؟
به منظور حل مشكل فوق از يك متغير session استفاده می گرديد. برای كاربرانی كه فرآيند Authentication را با موفقيت طی می نمايند يك متغير session ايجاد و در تمامی صفحات وجود اين متغير بررسی می گرديد تا هويت كاربر تشخيص و مجاز بودن وی برای استفاده از صفحه درخواستی تائيد گردد .
در ASP كلاسيك به منظور مديريت كاربران هيچگونه امكانات بالقوه ای وجود نداشته و پياده كنندگان می بايست علاوه بر ايجاد بستر اطلاعاتی مورد نياز ، ملزومات سيستم مديريت كاربران را پياده سازی نمايند .
ASP.NET 1.x
به منظور كاهش عمليات مورد نياز برای پياده سازی سيستم مديريت كاربران در ASP.NET 1.x ، امكانات متعددی ارائه گرديد . تائيد كاربران بر اساس فرم ، امكان تعريف قوانين و مجوزهای دستيابی در فايل web.config ، نمونه هائی در اين زمينه می باشد .
ASP.NET ، مفهوم تائيد بر اساس فرم را با استفاده از كلاس FormAuthentication معرفی تا امكان ورود و خروج از يك سايت با سهولت بيشتری فراهم گردد . بدين منظور از يك Authentication ticket حفاظت شده به منظور بخاطر سپردن اين كه چه كاربرانی login نموده اند ، استفاده می گرديد ( در زمان درخواست صفحات ) . برای ايجاد يك مكانيزم ايمن تبادل اطلاعات يك authentication ticket به عنوان يك كوكی بر روی كامپيوتر سرويس گيرنده ايجاد تا امكان بخاطر سپردن و تشخبص اين كه كاربر به برنامه و يا سايت login نموده است وجود داشته باشد (در درخواست های بعدی ) . كلاس FormAuthentication متدهای لازم به منظور كار با authentication ticket ( ايجاد :: logging و حذف :: logout ) را ارائه می نمايد.
تائيد كاربران مبتنی بر فرم به دنبال اين هدف بود تا بتواند يك رويكرد استاندارد برای انجام دو عمليات متداول در ارتباط با مديريت كاربران را ارائه نمايد .
روش فوق عليرغم مزايای متعدد ، پياده كنندگان را مجبور می نمايد كه همچنان حجم بالائی از كد را نوشته و مديريت بسياری از عمليات مرتبط با كاربران را خود انجام دهند( ايجاد صفحات login ,logoff ، تعريف يك كاربر جديد و ... ) . بدين ترتيب حجم كار پياده كنندگان نه تنها كمتر نمی گردد ، بلكه در بسياری از موارد نيز افزايش می يابد . رويكرد فوق باعث گرديد كه نتوان از يك روش جامع امنيتی استفاده نمود. مثلا" يك پياده كننده ممكن است اطلاعات كاربران را به صورت متن معمولی و رمزنشده در يك بانك ذخيره نمايد و ديگری به صورت hash .
ايده تائيد كاربران مبتنی بر فرم ارائه شده در ASP.NET 1.x ، يك ايده بزرگ و در عين حال جالب است ولی به نظر پياده سازی آن با در نظر گرفتن تمامی ملزومات مورد نياز يك سيستم مدرن مديريت كاربران انجام نشده است .
ASP.NET 2.0
فرآيند Authentication در ASP.NET 2.0 از طريق سرويس جديد membership و Authorization از طريق سرويس جديد Roles انجام می شود.
ASP.NET 2.0 كار آغاز شده در تائيد كاربران مبتنی بر فرم را كه در نسخه ASP.NET 1.x شروع شده بود ، تكميل و امكانات مناسبی برای انجام عمليات متفاوتی نظير تائيد كاربران ، ايجاد يك كاربر جديد ، حذف يك كاربر و ويرايش اطلاعات كاربران از طريق برنامه نويسی و به كمك كنترل های وب را ارائه نمود . شيوه عملكرد عمومی تائيد كاربران مبتنی بر فرم در ASP.NET 2.0 مشابه نسخه قبلی است و می بايست عمليات اوليه و پيكربندی لازم را از طريق فايل های پيكربندی انجام داد ( ثبت تنظيمات لازم در فايل web.config ) . چيزی كه در ASP.NET 2.0 به آن اضافه گرديد در واقع membership API و كنترل های وب ( سرويس دهنده ) امنيتی است . API فوق به برنامه نويسان اجازه می دهد از طريق كد به پتانسيل های سرويس membership دستيابی داشته باشند .
Membership API با استفاده از Provider model پياده سازی شده است . اين بدان معنی است كه عليرغم اين كه اينترفيس فوق به خوبی تعريف شده است ولی می توان در صورت تمايل ، پياده سازی آن را متناسب با شرايط موجود سفارشی نمود . فريمورك دات نت ، بدين منظور كلاس Membership را كه شامل متدهائی نظير CreateUser ,GetAllUser,Validateuser و ... است ، ارائه نموده است .سيستم membership قابليت ها و توانمندهای برنامه نويسی خود را از طريق كلاس Membership ارائه می نمايد . از كلاس فوق می توان مستقيما" در صفحات وب استفاده نمود . مثلا" می توان يك صفحه را ايجاد كه تمام كاربران در سيستم را ليست نمايد ( استفاده از متد Membership.GetAllUsers كه به يك GridView نسبت داده شده باشد) .
ASP.NET به همراه دو Membership provider از قبل تعبيه شده ارائه شده است .يكی برای ذخيره اطلاعات كاربران در يك بانك اطلاعاتی SQL و ديگری كه از اكتيو دايركتوری استفاده می نمايد .
علاوه بر موارد فوق ، ASP.NET 2.0 به منظور مديريت كاربران هفت كنترل متفاوت را ارائه كه با استفاده از آنان می توان برنامه های وبی را ايجاد نمود كه از پتانسيل سرويس های membership و roles استفاده نمايند . در واقع ، كنترل های فوق يك رابط كاربر مناسب برای انجام عمليات مرتبط با كاربران را ارائه می نمايند .
در صورتی كه از يك محل ذخيره سازی سفارشی استفاده شده باشد ( در صورت استفاده از يك membership provider سفارشی ) ، همچنان امكان استفاده از كنترل های فوق وجود خواهد داشت . اين كنترل ها عبارتند از :
Login : يك اينترفيس متداول برای login شامل نام و رمز عبور را ارائه می نمايد . به صورت پيش فرض ، زمانی كه كاربر بر روی دكمه login كليك می نمايد يك postback ايجاد و كنترل تلاش می نمايد تا بر اساس اطلاعات درج شده توسط كاربر وی را تائيد نمايد . بدين منظور متد ( Verify (Username,password مربوط به كلاس membership صدا زده می شود . در صورتی كه اطلاعات درج شده معتبر باشند ، يك authentication thicket برای كاربر ايجاد می گردد . در غيراينصورت يك پيام خطاء بر روی اينترفيس نمايش داده می شود .
LoginView : در برخی موارد لازم است كه در يك صفحه محتويات متفاوتی را با توجه به ماهيت كاربر ( ناشناس و يا تائيد شده ) ، نمايش داد. مثلا" زمانی كه يك كاربر ناشناس صفحه اصلی يك وب سايت را مشاهده می نمايد يك Login web control نمايش داده شود و زمانی كه يك كاربر تائيد شده همان صفحه را مشاهده می نمايد ، يك پيام خاص مرتبط با نام كاربر به همراه يك لينك جهت logoff نمايش داده شود . با استفاده از كنترل loginview می توان از دو تمپليت AnonymouseTemplate و LoggedInTemplate استفاده نمود . كنترل های وب و تگ های Html را می توان در AnonymouseTemplate برای كاربران ناشناس و كنترل ها و تگ های html برای كاربران تائيد شده را در LoggedInTemplate قرار داد . Loginview همچنين می تواند خروجی های متفاوتی را با توجه به نقش كاربر تائيد شده نمايش دهد .
PasswordRecovery : كنترل فوق ، اين امكان را در اختيار كاربران قرار می دهد تا بتوانند رمزعبور موجود و يا جديدی را از طريق email دريافت نمايند . در صورتی كه memebership provider رمز عبور را به صورت hashed ذخيره كرده باشد ، فرآيند بازيافت رمز عبور عملا" ايجاد يك رمز عبور جديد و تصادفی است كه برای كاربر ارسال می گردد . برای رمزهای عبوری كه به صورت plain text و يا رمز شده می باشند ، رمز عبور واقعی موجود برای كاربر از طريق email ارسال می گردد .
Loginstatus : كنترل فوق يك لينك به صفحه login را برای كاربران ناشناس و تائيد نشده ، نمايش خواهد داد . در صورتی كه يك كاربر تائيد شده صفحه را ملاقات نمايد ، يك لينك logoff برای وی نمايش داده می شود .
LoginName : كنترل فوق ، نام كاربر تائيد شده ای را كه به سيستم وارد شده است ، نمايش می دهد . با استفاده از User.Identity.Name در برنامه ، می توان به كاربرانی كه به سايت و يا برنامه login نموده اند ، دستيابی داشت .
CreateUserWizard : علاوه بر يك صفحه جهت logging ، هر وب سايت مبتنی بر account نياز به صفحه ای دارد تا مشخص نمايد كداميك از كاربران قادر به ايجاد يك كاربر جديد می باشند . كنترل CreateUserWizard ، يك رابط كاربر گرافيكی مناسب برای ايجاد يك كاربر جديد را ايجاد می نمايد.همانند كنترل login ، پس از تكميل داده در فيلدهای مورد نياز و كليك بر روی دكمه Create user ، متد CreateUser كلاس Membership فراخوانده می شود . CreateUserWizard همچنين می تواند در صورت نياز با استفاده از تمپليت ها سفارشی گردد.
Changepassword : از كنترل فوق به متظور تغيير رمز عبور استفاده می گردد .
تمامی كنترل های امنتيی اشاره شده را می توان بدون نياز به نوشتن كد استفاده نمود . مثلا" برای ايجاد يك صفحه login كافی است يك صفحه با نام Login.aspx را ايجاد و يك كنترل Login را بر روی آن قرار داد . بدين ترتيب شما دارای يك صفحه login می باشيد بدون اين كه لازم باشد از يك خط كد استفاده شود . در صورت تمايل می توان شكل ظاهری و يا منطق كنترل را تغيير داد .
در بخش دوم به بررسی امكانات سرويس جديد membership در ASP.NET 2.0 و نحوه استفاده از آن در برنامه های وب خواهيم پرداخت .
بـازم با گریه خوابم برد بـازم خواب تــــو را دیدم
دوباره....
چقدر غمگینم و تنـــها چقدر می خوام که باز بـارون بباره
بزن بــارون ببار آروم بروی پلکای خسته ام
بزن بــارون تو می دونی هنوزم یاد اون هستم