مشاهده نسخه کامل
: نمایش کاربران آنلاین و بلاک کردن کاربران در Identity 2
درود ,
دوتا سوال در مورد Identity 2 :
1 - چطوری میشه یک کاربر رو غیر فعال یا بلاک کرد که نتونه دیگه به سایت وارد بشه و اگر هم تو سایت باشه آنی Logout بشه ؟
تو StackOverFlaow چند مورد رو تست کردم ولی جواب نگرفتم - فیلد IsEnabled رو هم به جدول کاربران اضافه کردم که در پایین میبینید- اگه امکان داره یکم به زبان شیرین فارسی توضیح بدید.
2 -چطور میشه فهمید که چه کاربری آنلاینه و چه کاربری آفلاین ؟
فیلد های زیر کاربردشون چیه ؟
[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]
سلام
این یک سامانه حداقلی است تا نیازهای مرسوم را جواب دهد.
خودم در یک پروژه شخصی با شش زیر برنامه وب کاملا مختلف از این استفاده کردم
ولی برای کار شرکت چیزی برای خودمان از صفر نوشتیم.
چطور میشه فهمید که چه کاربری آنلاینه و چه کاربری آفلاین ؟
"کاربران آنلاین" بحث مجزایی است و Identity در این حوزه وارد نشده.
چون HTTP یک پروتکل منفصل است، هیچ مکانیزم مشخصی برای تشخیص کاربران آنلاین وجود ندارد.
فقط هروقت کاربران دکمه و لینک جدیدی را کلیک کنند، درخواستی ارسال شده و ما میفهمیم کاربر هنوز پشت سیستم نشسته...
ولی درکل پیاده سازیش زیاد هم سخت نیست.
میتوانید یک کش(cache) یگانه(singleton) زمان دار ایجاد کنید و کاربران را به آن اضافه کنید.
تا مثلا ID یا نام هرکاربر از آخرین اتصالش 15 دقیقه در کش بماند.
اینطور هم تعداد وهم هویت تک تک کاربران آنلاین را دارید.
برای اینکار میتوانید از کلاس System.Runtime.Caching.MemoryCache ([ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ]) استفاده کنید.
یا همان dll ای که برای تبدیل متنی تاریخ شمسی خدمت تان دادم کلاسی به نام Diamond.Bussines.CacheSingleTime دارد که مناسب این قبیل کارهاست.
چطوری میشه یک کاربر رو غیر فعال یا بلاک کرد که نتونه دیگه به سایت وارد بشه و اگر هم تو سایت باشه آنی Logout بشه ؟
این کمی سخت تر است!
مفهوم Lockout در Identity گرچه نیم بند برای منظور شما هم شاید کار کند ولی هدفش چیز دیگری است.
اگر LockoutEnabled فعال باشد و تاریخ LockoutEndDate هم پرباشد، کاربر فقط امکان Login در صفحه User-Pass را نخواهد داشت.
این برای حملاتی موسوم به brute-force است... وقتیکه فردی مدام تلاش میکند و گذرواژه های مختلف را امتحان میکند، مفهوم Lockout امکان میدهد تا دسترسی Loginبه یک Username خاص را برای 10 دقیقه یا 15 دقیقه و... مسدود کنیم.
برای این کار هم باید خودتان اقدام کنید
میتوان با یک فیلدی مانند isenabled در دیتابیس شروع کرد...
یا حتی میتوان از همان LockoutEnabled و LockoutEndDate استفاده کرد
ولی مشکل در جای دیگری بروز میکند
درواقع مشکل اولیه از آنجا بروز میکند که وقتی شما بظاهر یک صفحه را در مرورگر باز میکند یک درخواست http ارسال نمیشود، یعنی درعمل همزمان ده ها درخواست مستقل http به سرور ارسال میشود، آنهم بابت رویت یک صفحه.
Identity برای سرعت بیشتر و همچنین کاهش تراکنش با دیتابیس از کوکی های رمزنگاری شده استفاده میکند.
توضیح زیاد میتوان داد... حوصله من و شما سرخواهد رفت...
خلاصه آنکه شما میگویید اگر کاربر در سایت هم باشد sign-out شود(؟!) اجازه دهید من بدترش را بگوییم تا خیالتان راحت (شاید هم ناراحت!) شود.
وقتی کاربر از صفحه Login و درج User,Pass رد شد دیگر خرش از پل گذشته ... !
حتی اگر صفحه را ببندد و پس فردا مجدد وارد سایت شود، بدلیل وجود کوکی رمزنگاری شده ، هسته مرکزی Identity او را تشخیص هویت داده و خودکار لاگین میکند و نکته مهم آنکه برای اینکار از دیتابیس هم استفاده نمیکند !
پس تغییر isenabled نه تنها روی کاربران آنلاین شما، بلکه روی کاربران آفلاین شما هم تاثیر نمیگذارد !
راه حل:
باید کدی در فاز Authenticate بنویسید تا isenabled را از دیتابیس برای آن کاربر خاص بررسی کند.
البته انجام هرباره این کار برای هردرخواست Http شاید باعث کمی کندی سرعت شود.
برای جلوگیری از افت سرعت میتوانید یک dictionary یگانه(singleton) از ID کاربر به bool داشته باشید که وضعیت isenabled کاربران را با بارگذاری تنبل (lazy-loading) نگهداری کند تا بتوانید با تغییر تنظیمات امنیتی این مخزن را clear کنید، فراموش نکنید باید مفهوم های چند ریسمانی و انواع قفل ها(lock) و... را هم لحاظ کنید.
یا
برای جلوگیری از کندی سرعت میتوانید از روش های change-tracker-versioning استفاده کنید.
(خودم در کارهای شخصی و هم در شرکت از Diamond.Bussines.ChangeTrackerCollection استفاده کردم ولی الان که فکر میکنم، گمانم نیاز شما بتوان بدون این کلاس هم با کمی کد برآورده کرد...)
حالا سرتان را درد آوردم و دیروقت هم است...
شما کمی روی این مسائل تحقیق وکار کنید، ببینید تا کجایش را انجام میدهید.
موفق باشید.
vBulletin , Copyright ©2000-2025, Jelsoft Enterprises Ltd.