یک ویژگی عالی در پلت فرم 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 به صورت زیر نمایش داده می شود:
حال Log off نموده و سپس با salesexecutive@mssales.com وارد شوید و بر روی لینک Sale Product کلیک نمایید. action method مورد نظر برای این کاربر نیز اجرا خواهد شد:
برای دانلود سورس کامل این اپلیکیشن میتوانید اینجا کلیک نمایید.
نتیجه گیری
در یک اپلیکیشن ASP.NET MVC، ما میتوانیم به یک action method با تعیین نمودن چند نقش کاربری به صورت داینامیک در یک فایل کانفیگ، دسترسی داشته باشیم.