View Full Version : سطح دسترسی چند بخشی
IR-Developer
پنج شنبه 07 مرداد 1395, 12:53 عصر
سلام من میخوام سطح دسترسی 2 سطحی تعریف کنم . یعنی سطح اول دسترسی به کنترلر ها . و سطح بعدی دسترسی به اکشن ها . کنترلر ها میشه بخشها که شامل مثلا بخش کارمندان هست و سطح دوم میشه اکشن ها که شامل فرم های new - edit - delete میشه . اگر بخوام از فیلتر autorize استفاده کنم که باید role ها را برای یک سطح تعریف کنم . میخوام role ها برای هر 2 سطح تعریف بشن . مثلا premission تعریف بشه برای دسترسی به فرم ویرایش کاربران . ولی اجازه ی ثبت جدید نداشته باشه . فعلا اومدم یک فیلتر تعریف کردم بر اساس URL چک میکنم . مثلا اگر وارد کنترلر کارمندان شد مثلا نمیزارم وارد اکشن new بشه . فقط edit را بتونه باز کنه .ولی اصولی نیست این . ساختار اصولی میخوام . چک کردن این ساختار توی پروژه باعث کثیف کاری شده ...
از چه تکنیک و روش هایی میشه استفاده کرد ؟
ممنون
Moien Tajik
پنج شنبه 07 مرداد 1395, 14:00 عصر
شما در بالای کنترلر میتونید role اول رو تعریف کنید ، در داخل اکشن ها با IsInRole چک کنید که کاربر توی Role دوم که میخواید هستش یا نه . اگر بود بتونه اون action هارو انجام بده و اگر نبود ModelError اضافه کنه که سطح دسترسی رو نداره ...
If(userManager.IsInRole(User.Identity.GetUserId() , "YourRole"))
{
// Can Create , Delete , Edit
}
else
{
// Not Authorized User
}
omid nasri
پنج شنبه 07 مرداد 1395, 22:31 عصر
پیاده سازی داینامیک اعتبارسنجی سطح دسترسی رو باید انجام بدید. اگر با پیاده سازی اتربیوت آشنایی دارید یک اتربیوت کاستوم تعریف کنید که یک ورودی دریافت خواهد کرد و آن ورودی نام اکشن خواهد بود. مثلا بر روی هر کدام از اکشن ADD, Edit, Show, Remove قرار دهید پارامتر دریافتی همان نام اکشن خواهد بود که اتربیوت را بالای آن اکشن تعریف نمودهاید.
خب اکنون جدول کنترلر را تعریف کنید که لازم است نام متدها در آن تعریف شود.
جدول دوم نام رول ها را ذخیره کنید.
جدول سوم لازم است دو کلید تعریفی برای جدول رول و کنترلر قرار گیرد.
جدول چهارم کلید کاربر و کلید جدول سوم قرار خواهد گرفت که مشخص میکنید که کاربر جاری به کدام رول(متدها تعریفی برای این رول) دسترسی دارد.
برای پیاده سازی متد جهت انجام بخش جدول چهارم شما باید در اتربیوت تعریفی ای دی کاربر جاری با نام کنترلر را برسی کنید که ایا کاربر جاری به این اکشن دسترسی دارد یا نه. که در این صورت شما قادر هستید یک سیستم مدیریت سطح دسترسی داینامیک داشته باشید همچنین لازم به ذکر است این فقط بخش سرور را پشتیبانی خواهد کرد که برای حذف دکمه ها در سمت کاربر لازم است یک فیلد به جدول مربوطه اضافه شده که در سمت کاربر با لیست دریافتی از ای دی کنترلرهای سمت کاربر آن ها را برسی کرده و در صورت نداشتن سطح دسترسی با استفاده از JavaScript آن تگ را از روی صفحه حذف کنید.
پیشنهاد بعدی سرچ در گوگل.
امیدوارم مفید واقع شود.
IR-Developer
یک شنبه 10 مرداد 1395, 08:34 صبح
پیاده سازی داینامیک اعتبارسنجی سطح دسترسی رو باید انجام بدید. اگر با پیاده سازی اتربیوت آشنایی دارید یک اتربیوت کاستوم تعریف کنید که یک ورودی دریافت خواهد کرد و آن ورودی نام اکشن خواهد بود. مثلا بر روی هر کدام از اکشن ADD, Edit, Show, Remove قرار دهید پارامتر دریافتی همان نام اکشن خواهد بود که اتربیوت را بالای آن اکشن تعریف نمودهاید.
خب اکنون جدول کنترلر را تعریف کنید که لازم است نام متدها در آن تعریف شود.
جدول دوم نام رول ها را ذخیره کنید.
جدول سوم لازم است دو کلید تعریفی برای جدول رول و کنترلر قرار گیرد.
جدول چهارم کلید کاربر و کلید جدول سوم قرار خواهد گرفت که مشخص میکنید که کاربر جاری به کدام رول(متدها تعریفی برای این رول) دسترسی دارد.
برای پیاده سازی متد جهت انجام بخش جدول چهارم شما باید در اتربیوت تعریفی ای دی کاربر جاری با نام کنترلر را برسی کنید که ایا کاربر جاری به این اکشن دسترسی دارد یا نه. که در این صورت شما قادر هستید یک سیستم مدیریت سطح دسترسی داینامیک داشته باشید همچنین لازم به ذکر است این فقط بخش سرور را پشتیبانی خواهد کرد که برای حذف دکمه ها در سمت کاربر لازم است یک فیلد به جدول مربوطه اضافه شده که در سمت کاربر با لیست دریافتی از ای دی کنترلرهای سمت کاربر آن ها را برسی کرده و در صورت نداشتن سطح دسترسی با استفاده از JavaScript آن تگ را از روی صفحه حذف کنید.
پیشنهاد بعدی سرچ در گوگل.
امیدوارم مفید واقع شود.
خوب من از قبل هم تقریبا شبیه همین را با کاستوم اتریبیوت پیاده سازی کرده بودم ولی میخوام با سیستم احراز هویت یکپارچه باشه و وقتی با استفاده از Role Provider میام نقش های کاربران را استخراج میکنم با همین دستورات Is In Role سطح دسترسی را چک کنم . در کل با پیاده سازی این روش مشکل خاصی ندارم فقط قصد من استفاده از روش اصولی تر و کدنویسی زیبا و خواناتر بود .
omid nasri
یک شنبه 10 مرداد 1395, 12:20 عصر
خب این تغییرات شامل بخش Role Provider هم خواهد شد.
keyone72
شنبه 16 مرداد 1395, 19:45 عصر
سلام من میخوام سطح دسترسی 2 سطحی تعریف کنم . یعنی سطح اول دسترسی به کنترلر ها . و سطح بعدی دسترسی به اکشن ها . کنترلر ها میشه بخشها که شامل مثلا بخش کارمندان هست و سطح دوم میشه اکشن ها که شامل فرم های new - edit - delete میشه . اگر بخوام از فیلتر autorize استفاده کنم که باید role ها را برای یک سطح تعریف کنم . میخوام role ها برای هر 2 سطح تعریف بشن . مثلا premission تعریف بشه برای دسترسی به فرم ویرایش کاربران . ولی اجازه ی ثبت جدید نداشته باشه . فعلا اومدم یک فیلتر تعریف کردم بر اساس URL چک میکنم . مثلا اگر وارد کنترلر کارمندان شد مثلا نمیزارم وارد اکشن new بشه . فقط edit را بتونه باز کنه .ولی اصولی نیست این . ساختار اصولی میخوام . چک کردن این ساختار توی پروژه باعث کثیف کاری شده ...
از چه تکنیک و روش هایی میشه استفاده کرد ؟
ممنون
برای این منظور در دیتا بیستون یک فیلد با نام Role اختصاص بدید و این کد رو در فایل Global.asax وارد کنید
protected void FormsAuthentication_OnAuthenticate(Object sender, FormsAuthenticationEventArgs e)
{
if (FormsAuthentication.CookiesSupported == true)
{
if (Request.Cookies[FormsAuthentication.FormsCookieName] != null)
{
try
{
string username = FormsAuthentication.Decrypt(Request.Cookies[FormsAuthentication.FormsCookieName].Value).Name;
var blUser = new UserRepository();
string roles = blUser.Where(p => p.UserName == username).Single().Roles;
e.User = new GenericPrincipal(new System.Security.Principal.GenericIdentity(username ), roles.Split(','));
}
catch (Exception)
{
}
}
}
}
حال میتونید بالای اکشن ها از این مورد استفاده کنید..
[Authorize]
public class PanelController : Controller
{
[AllowAnonymous]
public ActionResult a()
{
}
[Authorize(Roles = "User")]
public ActionResult b()
{
}
[Authorize(Roles = "Admin,User")]
public ActionResult c()
{
}
}
در کد بالا کلا اعتبار سنجی میشن همه اکشن ها
اکشن اول اعتبار سنجی نمیشه و هر کاربری میتونه وارد بشه
اکشن دوم فقط کاربری که نقشش یوزر هست میتونه وارد بشه این User همون فیلدی در دیتابیس ست که به صورت رشته تعریف شده و برابر مثلا User یا Admin است یا هردو به این شکل Admin,User در دیتابیس باید سیو شود
یا در ویو ها از این کد استفاده کنید
@if (Model.User.Roles == "Admin")
{
<div>من ادمین هستم</div>
}
loti88
دوشنبه 25 مرداد 1395, 15:13 عصر
دوست عزیز شما یه جدول دیگه ایجاد کن به اسم RoleAcceess مثلا!
فیلد های این جدول به این صورت باشن (Controller,Action,RoleId)
رول رو که تعریف میکنی بهش سطح دسترسی به کنترلر و اکشن رو بده و از طریق CustomAthorize میتونی به صورت داینامیک سطح دسترسی به هر کنترلر و اکشن مربوطشو کنترل کنی،البیه اگه از ASp.net Identity و Owin Security استفاده میکنی.
اگه کل قضیه رو میخوای متوجه بشی و پیاده سازی کنی از این لینک کمک بگیر کامل توضبح داده شده
http://fa.mohsen.es/post/3/%D9%85%D8%AF%DB%8C%D8%B1%DB%8C%D8%AA-%D8%AF%DB%8C%D9%86%D8%A7%D9%85%DB%8C%DA%A9-%D8%B3%D8%B7%D9%88%D8%AD-%D8%AF%D8%B3%D8%AA%D8%B1%D8%B3%DB%8C-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1%D8%A7%D9%86-%D8%AF%D8%B1-asp-net-mvc-5-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-asp-net-identity-2
parsdarab
دوشنبه 25 مرداد 1395, 15:34 عصر
اره این پیاده سازی خوبیه
منم استفاده کردم
بعدشم با رفلکشن نام فارسی و اسم رول ها رو بگیر و بریز داخل جدول role ها.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.