PDA

View Full Version : سوال: سفارشی کردن identity 2 با تنظیم دسترسی ها



ictboy
یک شنبه 05 مرداد 1399, 13:31 عصر
باسلام و خسته نباشید
من برای استفاده از identity 2 در ASP.net MVC 5 چند تا سوال دارم ممنون میشم راهنمایی بفرمایید:
1- آیا در ایجاد کاربر میشه ایمیل وارد نکرد و نام کاربری وارد کنیم؟ نمونه ها و مثال هایی که زده میشه برای سیستم های عضو گیری هست که خود کاربر میاد و ثبت نام رو انجام میده ولی من منظور استفاده از identity بعنوان سیستم مدیریت کاربران در برنامه های مثل اتوماسیون هست. بصورتی که یک ادمین در حال تعریف کاربران هست و دسترسی های هر کاربر در بخش های مختلف رو مشخص می کنه.
2- چطور میشه یک سری دسترسی ها رو به نقش ها یا کاربران اختصاص داد و در زمان فراخوانی هر کنترلر اون ها رو بررسی کرد؟ در حالت کلی ما میگیم هر کس مثلا نقش admin داره بتونه فلان اکشن از فلان کنترلر رو باز کنه ولی اگر بخوایم دسترسی ها رو ریزتر کنیم مثلا بگیم کاربر 1 دارای نقش 2 هست و دسترسی ایجاد، ویرایش، حذف و... رو داره یا ندارهمثلا جدول دسترسی به شکل زیر داشته باشیم.



شناسه کاربر
شناسه بخش
دسترسی ایجاد
دسترسی ویرایش
دسترسی حذف


100
1
True
True
True


101
1
True
False
False



من چنین جدولی دارم که دسترسی کاربرانم رو توش ذخیره می کنم و یک AuthorizeAttribute هم نوشتم تا کاربر لاگین شده رو بررسی کنم دسترسی براساس جدول بالا رو داره یا نه. آیا identity رو با چنین ساختاری میشه پیاده سازی کرد یا نه؟اگر نه برای چنین حالت هایی چه راهکاری وجود داره؟

3- در حال حاضر من از OWIN استفاده نمی کنم. موقعی که کاربر لاگین میکنه با اینکه در webconfig تنظیم کردم timeout=30 باشه ولی کاربر اگر از سیستم استفاده نکنه در زمان کمتر از 5 دقیقه به صفحه لاگین هدایت میشه. آیا با راه اندازی owin این مشکل حل میشه یا ایراد کار از جای دیگه است.

ممنون

ali_md110
یک شنبه 05 مرداد 1399, 22:03 عصر
سلام
تقریبا 5 سال قبل مواردی که گفتید پیاده سازی کردم و همه موارد قابل اجرا هست
جواب سوال اول بله قابل تنظیم هست
در کلاس
ApplicationUserManager

ApplicationUserManager : UserManager<ApplicationUser>

سوال دوم هم به راحتی قابل پیاده سازی هست و حتی میتوانید منوی داینامیک بر اساس هر رول بسازید شما در این مرحله باید رول داینامیک بسازید و در دیتابیس ذخیره کنید
سول سوم ربطی به timeout=30 ندارد و جای دیگر باید تنظیم انجام داد

ictboy
دوشنبه 06 مرداد 1399, 09:26 صبح
سلام
تقریبا 5 سال قبل مواردی که گفتید پیاده سازی کردم و همه موارد قابل اجرا هست
جواب سوال اول بله قابل تنظیم هست
در کلاس
ApplicationUserManager

ApplicationUserManager : UserManager<ApplicationUser>

سوال دوم هم به راحتی قابل پیاده سازی هست و حتی میتوانید منوی داینامیک بر اساس هر رول بسازید شما در این مرحله باید رول داینامیک بسازید و در دیتابیس ذخیره کنید
سول سوم ربطی به timeout=30 ندارد و جای دیگر باید تنظیم انجام داد


ممنون از راهنمایی تون

مورد یک : تو نمونه که خود Owin داده تو این کلاسی که شما اشاره کردم چنین کدی هست


manager.UserValidator = new UserValidator<ApplicationUser>(manager) {


AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = true
};
منظورتون این هست که RequireUniqueEmail = true رو برابر false قرار بدم.

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

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

باتشکر

مهدی کرامتی
دوشنبه 06 مرداد 1399, 13:37 عصر
1- آیا در ایجاد کاربر میشه ایمیل وارد نکرد و نام کاربری وارد کنیم؟ نمونه ها و مثال هایی که زده میشه برای سیستم های عضو گیری هست که خود کاربر میاد و ثبت نام رو انجام میده ولی من منظور استفاده از identity بعنوان سیستم مدیریت کاربران در برنامه های مثل اتوماسیون هست. بصورتی که یک ادمین در حال تعریف کاربران هست و دسترسی های هر کاربر در بخش های مختلف رو مشخص می کنه.
یک راهش همونی هست که در این پست (https://barnamenevis.org/showthread.php?561842-%D8%B3%D9%81%D8%A7%D8%B1%D8%B4%DB%8C-%DA%A9%D8%B1%D8%AF%D9%86-identity-2-%D8%A8%D8%A7-%D8%AA%D9%86%D8%B8%DB%8C%D9%85-%D8%AF%D8%B3%D8%AA%D8%B1%D8%B3%DB%8C-%D9%87%D8%A7&p=2433004&viewfull=1#post2433004) نوشتید. به هر حال، برای پیاده سازی یک سیستم کامل کنترل دسترسی، کلیه جزئیات در قالب یک پکیج آموزشی (https://barnamenevis.net/Home/Course/14?پکیج-آموزش-ASP.NET-MVC---سطح-3:-آموزش-کامل-ASP.NET-Identity-و-سیستم-کنترل-دسترسی-کامل) به صورت قدم به قدم تشریح شده است. سورس پروژه هم بر روی گیت هاب (https://github.com/delphiassistant/permission_control_system) موجود است.


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



3- در حال حاضر من از OWIN استفاده نمی کنم. موقعی که کاربر لاگین میکنه با اینکه در webconfig تنظیم کردم timeout=30 باشه ولی کاربر اگر از سیستم استفاده نکنه در زمان کمتر از 5 دقیقه به صفحه لاگین هدایت میشه. آیا با راه اندازی owin این مشکل حل میشه یا ایراد کار از جای دیگه است.
مشکل Logout شدن زودتر از زمان پیش بینی شده ربطی به OWIN ندارد. مشکل این است که در اکثر هاست ها، حافظه کمی به Application Pool هر دامین اختصاص می دهند، بنابراین با پر شدن حافظه اختصاصی سایت شما، Session و دیگر محتویات Application Domain از حافظه تخلیه می شود و Application Pool تا دریافت Request بعدی Terminate می شود. کوکی احراز هویت نیز (با اینکه اینکار نادرست است) به صورت پیش فرض به Session مرتبط است.
برای حل مشکل، سرچ کنید چگونه می توانید Session را طوری پیکربندی کنید که از یک دیتابیس SQL Server بجای حافظه رم استفاده کند.

ictboy
دوشنبه 06 مرداد 1399, 15:02 عصر
ممنون از راهنمایی خوبتون جناب کرامتی

فقط موضوعی که برام سوال هست اینه که Identity از کوکی برای نگهداری احراز هویت استفاده می کنه. تغییر پیکربندی Session به SQL Server برای Identity هم تاثیر داره؟ چون من اطلاعات کاربر رو در Session نمی ریزم.
تصور من این بود که تنظیمات sessionState و Mode های اون زمانی استفاده میشه که بعد از لاگین اطلاعات رو داخل session ذخیره کنیم. اگر اشتباه میگم لطفا راهنمایی بفرمایید.

مهدی کرامتی
دوشنبه 06 مرداد 1399, 19:03 عصر
حتی اگر شما از Session در برنامه استفاده نکرده باشید مکانیسم Identity متاسفانه رد کوکی لاگین رو در Session، و نیز مشخصات Session کنونی رو در کوکی لاگین نگهداری می کنه. بنابراین، خواه ناخواه این اتفاق میافته و اون ارتباط وجود داره.

یک پیشنهادی دارم که خودم تستش نکردم، اما بد نیست شما تستش کنید:
با استفاده از کتابخانه ای مانند Quartz یا Hangfire، یک تسک بنویسید که دو دقیقه یک بار با استفاده از HttpClient یا کلاسی مثل اون، یکی از صفحات سبک سایت رو Get کنه و داخل یک متغیر قرار بده. لازم نیست با محتویات اون متغیر کاری انجام بدید، مهم اجرای اون دستور Get است که حکم یک Request از یک کاربر به یکی از صفحات سایت شما رو داره و باعث میشه پروسه سایت شما بخاطر Idle بودن Terminate نشه. کد فوق هم با استفاده از Hangfire می تونه در دل خود Web Application شما جاگذاری بشه.

ictboy
سه شنبه 07 مرداد 1399, 09:38 صبح
ممنون از توضیحات خوبتون

میخواستم با Quartz چنین کاری انجام بدم ولی بنظرم کار اصولی نیومد ازش منصرف شدم. ناچار شدم چنین کاری انجام میدم.
ضمنا نمونه کدی که در پکیج آموزشی تون بود خیلی خوب و کامل بود و راهنمای مناسبی هست.
باتشکر