دسترسی به Action Method با چند Role با استفاده از webConfig در ASP.NET MVC
شناسه پست: 1185
بازدید: 1587

یک ویژگی عالی در پلت فرم ASP.NET MVC، سهولت پیاده سازی امنیت برای کنترل دسترسی اپلیکشن برای کاربران و نقش ها می باشد. پیاده سازی امنیت بر اساس Role در ASP.NET MVC را میتوانید در این لینک مطالعه نمایید. این مقاله به شما نشان می دهد که چطور می توانید با استفاده از ASP.NET Identity و کلاس IdentityRole، نقش ها را بسازید و مدیریت نمایید. این مقاله همچنین نحوه ایجاد یک کلاس AuthorizeAttribute سفارشی برای احراز مجوز بر اساس نقش های کاربران را نشان میدهد.

در MVC، ما میتوانیم دسترسی به یک Action Method موجود در کنترلر را با استفاده از Authorize attribute کنترل نماییم. این یک کلاس از نوع action filter است که خصوصیات Users  و Roles  را ارائه می دهد. این خصوصیات میتواند شامل کاربران یا نقش های جدا شده توسط کاما ( , ) باشد و از این رو ما میتوانیم دسترسی به یک Action Method را با تعیین نمودن چند کاربر یا نقش مدیریت نماییم. برای این منظور یک رویکرد این است که دقیقا نام کاربران و یا نقش ها را hard code نماییم که نمیتواند ایده خوبی در طول تولید برنامه باشد. از آنجایی که Role ها به صورت داینامیک میتواند توسط مدیر ایجاد گردد پس نیاز است که ما از تکنیکی استفاده نماییم تا آنها در اپلیکیشن پیکربندی گردند. ما میتوانیم این امکان را با استفاده از Web.config پیاده سازی نماییم.

پیاده سازی دسترسی به Action Method با چند User و Role

برای پیاده سازی این اپلیکیشن، لطفا با کلیک بر روی این لینک نگاهی به مقاله پیاده سازی امنیت بر اساس Role در ASP.NET MVC بیندازید.اپلیکیشن را دانلود نموده و آن را Extract نمایید. پروژه را با ویژوال استودیو 2013/2015 باز نمایید. پوشه App_Data شامل کلاس SuperMarket.mdf می باشد. این دیتابیس اپلیکیشن می باشد که شامل جدول ProductMaster می باشد. اسکریپت این جدول به صورت زیرمی باشد:

CREATE TABLE [dbo].[ProductMaster](
    [ProductId] [int] IDENTITY(1,1) NOT NULL,
    [ProductName] [varchar](50) NOT NULL,
    [Price] [varchar](50) NOT NULL)


این برنامه شامل RoleController می باشد که مسئول ایجاد Role ها می باشد. زیرپوشه Roles از پوشه Views  شامل Viewهایی برای ایجاد و نمایش تمام Roleها می باشد.

AccountController شامل کدی برای ایجاد کاربران می باشد. در این کنترلر، متد Register از نوع HttpPost  شامل کد زیر برای اختصاص Roleها به کاربر می باشد:

await this.UserManager.AddToRoleAsync(user.Id, model.Name);

 

مرحله 1:برنامه را اجرا نموده و Role های زیر را ایجاد نمایید:

  • Manager
  • Sales Executive
  • Sales Manager

مرحله 2: کاربران زیر را با استفاده از Register View ایجاد نمایید:

  • manager@mssales.com با نقش Manager
  • salesmanager@mssales.com با نقش Sales Manager
  • salesexecutive@mssales.com با نقش Sales Executive

مرحله 3: کلاس ProductController را باز نمایید. این کلاس شامل اکشن متدهای Create  و SaleProduct می باشد. این متدها با AuthLog attribute اعمال شده اند که دارای خصوصیت Role با مقادیر Manager و Sales Executive می باشد. این به این معنیست که فقط کاربران با نقش های مربوطهمیتوانند به این متدها دسترسی داشته باشند. به هرحال کاری که ما میخواهیم انجام دهیم این است که قصد داریم متد SaleProduct  توسط نقش های Sales Executive و Sales Manager مورد دسترسی قرار گیرند، امادر حال حاضر نمیخواهیم که این مقادیر را در AuthLog attribute به صورت مستقیم قرار دهیم و یا hard code نماییم. به این منظور، ما میخواهیم مراحل زیر را دنبال نماییم:

مرحله 4: فایل Web.config را باز نمایید و یک Section سفارشی را رد configSections اضافه نمایید:

<section name="AppRoles" type="System.Configuration.NameValueFileSectionHandler,System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />

 

و تگ زیر را نیز اضافه نمایید:

<AppRoles>
    <add key="AppPermissions" value="Sales Executive,Sales Manager" />
</AppRoles>

تگ بالا کلید AppPermission را با مقادیر Sales Executive   و Sales Manager تعریف مینماید. توجه داشته باشید از آنجایی که این یک فایل پیکربندی می باشد ما میتوانیم به صورت داینامیک مقادیر را هروقت که نیاز بود به AppPermission اضافه نماییم.

مرحله 5: در پوشهCustomFilters ما کلاس LogAuthFilter.cs را داریم که شامل  کلاس AuthLogAttribute می باشد. این کلاس از کلاس AuthorizeAttribute مشتق شده می باشد. این کلاس شامل منطقی برای برنامه امنیت بر اساس Role می باشد. کد سازنده را به صورت زیر تغییر دهید:

public AuthLogAttribute(params string[] roleIds)
{
    var appRoles = new List<string>();
    var roleList = (NameValueCollection)ConfigurationManager.GetSection("AppRoles");
    foreach (var roleId in roleIds)
    {
        appRoles.AddRange(roleList[roleId].Split(new[] { ',' }));
    }
    Roles = string.Join(",", appRoles);
    View = "AuthorizeFailed";
}

این سازنده ورودی از نوع params array به نام roleIds را دریافت مینماید. متغیر roleList برای ذخیره تمام مقادیر موجود در AppRoles section ایجاد شده در فایل Web.config  در مرحله 4 می باشد. اینجا با پیمایش مقادیر موجود در roleIds، تمام مقادیر موجود در کلید سفارشی (AppPermissions) ایجاد شده در فایل Web.config بر روی اکشن متد مورد نظر در کنترلر اعمال می شود. این شمال لیستی از تمام Role ها میباشد.این کد در نهایت تمام نقش ها را در ویژگی Role ذخیره مینماید.

مرحله 6: مقدار AuthLog attribute بر روی اکشن متد SaleProduc را همانند کد زیر تغییر دهید:

[AuthLog("AppPermissions")]
public ActionResult SaleProduct()
{
    ViewBag.Message = "This View is designed for the Sales Executive and Sales Manager to Sale Product.";
    return View();
}

AuthLog اینجا AppPermissions را به عنوان ورودی دریافت میکند. این ورودی به سازنده AuthLogAttribute  پاس داده می شود.اینکد در سازنده تماممقادیر تعریف شده در کلید AppPermission را از فایل web.config میخواند که شامل Sales Executive و Sales Manager می باشد. این به این معنی است که متد SaleProduct  میتواند توسط کاربران با نقش های مربوطه قابل دسترس باشند.

اپلیکیشن را اجرا نمایید و با salesmanager@mssales.com لاگین نمایید و سپس متد SaleProduct  را فراخوانی نمایید (با کلیک بر روی لینک Sale Product در بالای صفحه). سپس Sale Product view برای کاربر salesmanager@mssales.com به صورت زیر نمایش داده می شود:

دسترسی با Roleدر MVC

حال Log off نموده و سپس با salesexecutive@mssales.com وارد شوید و بر روی لینک Sale Product کلیک نمایید. action method مورد نظر برای این کاربر نیز اجرا خواهد شد:

دسترسی به Role در MVC

برای دانلود سورس کامل این اپلیکیشن میتوانید اینجا کلیک نمایید.

نتیجه گیری

در یک اپلیکیشن ASP.NET MVC، ما میتوانیم به یک action method با تعیین نمودن چند نقش کاربری به صورت داینامیک در یک فایل کانفیگ، دسترسی داشته باشیم.

نویسنده

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