بررسی ASP.NET Identity
- توسعه پایگاه داده سیستم دسترسی مبتنی بر نقش
- توسعه یک Customized Filter Attribute بر پایه Authorize Attribute
- توسعه سرویسهای مورد استفاده در Authorize Attribute
- توسعه کنترلر Permissions: تمامی APIهایی که در جهت همگام سازی دسترسیها بین کلاینت و سرور را بر عهده دارند در این کنترلر توسعه داده میشود.
- توسعه سرویس مدیریت دسترسی در کلاینت توسط AngularJS
توسعه پایگاه داده
public class Permission { [Key] public string Id { get; set; } public string Title { get; set; } public string Description { get; set; } public string Area { get; set; } public string Control { get; set; } public virtual ICollection<Role> Roles { get; set; } }
Control | Area |
view | products |
add | products |
edit | products |
delete | products |
با توجه به جدول فوق همانطور که مشاهده میکنید تمامی آنچه که برای دسترسی Products مورد نیاز است در یک حوزه و 4 کنترل گنجانده میشود. البته توجه داشته باشید سناریویی که مطرح کردیم برای روشن سازی مفهوم ناحیه یا حوزه و کنترل بود. همانطور که میدانیم در AngularJS تمامی اطلاعات توسط APIها فراخوانی میگردند. از این رو یک موهبت دیگر این روش، خوانایی مفهوم حوزه و کنترل نسبت به نام کنترلر و متد است.
مدل Roles را ما به صورت زیر توسعه دادهایم:
public class Role { [Key] public string Id { get; set; } public string Title { get; set; } public string Description { get; set; } public virtual ICollection<Permission> Permissions { get; set; } public virtual ICollection<User> Users { get; set; } }
در مدل فوق میبینید که دو رابطه چند به چند وجود دارد. رابطه اول که همان Permissions است و در مدل پیشین تشریح شد. رابطهی دوم رابطه چند به چند بین کاربر و نقش است. چند کاربر قادرند یک نقش در سیستم داشته باشند و همینطور چندین نقش میتواند به یک کاربر انتساب داده شود.
ما در این سیستم از ASP.NET Identity 2.1 استفاده و کلاس IdentityUser را override کردهایم. در مدل override شده، برخی اطلاعات جدید کاربر، به جدول کاربر اضافه شدهاند. این اطلاعات شامل نام، نام خانوادگی، شماره تماس و ... میباشد.
public class ApplicationUser : IdentityUser { [MaxLength(100)] public string FirstName { get; set; } [MaxLength(100)] public string LastName { get; set; } public bool IsSysAdmin { get; set; } public DateTime JoinDate { get; set; } public virtual ICollection<Role> Roles { get; set; } }
در نهایت تمامی این مدلها به وسیله EF Code First پایگاه داده سیستم ما را تشکیل خواهند داد.
توسعه یک Customized Filter Attribute بر پایه Authorize Attribute
public class RBACAttribute : AuthorizeAttribute { public string Area { get; set; } public string Control { get; set; } AccessControlService _AccessControl = new AccessControlService(); public override void OnAuthorization(HttpActionContext actionContext) { var userId = HttpContext.Current.User.Identity.GetCurrentUserId(); // If User Ticket is Not Expired if (userId == null || !_AccessControl.HasPermission(userId, this.Area, this.Control)) { actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized); } } }
[HttpPost] [Route("ChangeProductStatus")] [RBAC(Area = "products", Control = "edit")] public async Task<HttpResponseMessage> ChangeProductStatus(StatusCodeBindingModel model) { // Method Body }
بررسی تازههای TypeScript 3.0
Closure ها در JavaScript چیست ؟
مفهوم معماری نرم افزار چیست؟
در واقع Sequence روشی برای تولید اعداد ترتیبی با قابلیت افزایش یا کاهش عددهای دلخواه میباشد که توسط کاربر یا برنامه نویس ایجاد میشود. بنابراین Sequenceها User-Defined میباشند.
در اینجا ممکن است سئوالی پیش بیاید که اینکار توسط Identity هم قابل انجام است، اما چرا استفاده از Sequence توسط مایکروسافت پیشنهاد میشود.
بدلایل زیر استفاده از Sequence بهتر میباشد:
- ممکن است Application شما قبل از درج رکورد، درون یک جدول نیاز به عدد منحصربفردی داشته باشد.
- عدد تولید شده بوسیله Sequence را میتوانید بین جداول یا ستونهای مختلف یک جدول به اشتراک بگذارید.
- میتوانید روند تولید اعداد ترتیبی را Restart نمایید. به عبارت دیگر قابلیت Restart نمودن Sequence وجود دارد.
- میتوانید Sequence خود را براساس Sort یک یا چند فیلد، تنظیم نمایید.
Syntax آن به شرح ذیل میباشد:
CREATE SEQUENCE [schema_name . ] sequence_name [ AS [ built_in_integer_type | user-defined_integer_type ] ] [ START WITH <constant> ] [ INCREMENT BY <constant> ] [ { MINVALUE [ <constant> ] } | { NO MINVALUE } ] [ { MAXVALUE [ <constant> ] } | { NO MAXVALUE } ] [ CYCLE | { NO CYCLE } ] [ { CACHE [ <constant> ] } | { NO CACHE } ] [ ; ]
شرح Syntax :
- در زمان ایجاد Sequence، نوع آن میبایست عددی باشد، چنانچه ،Type آن را مشخص ننمایید، SQL Server، نوع آن را bigint در نظر میگیرد.
- Start With: بدین مفهوم میباشد، که Sequence ایجاد شده از چه عددی آغاز شود.
- INCREMENT BY: مفهومش این است که Sequence به چه مقداری افزایش یا کاهش یابد. به عبارت دیگری عدد تولید شده براساس مقدار Increment by تولید میشود.
- Minvalue: کمترین مقداری که Sequence میتواند ایجاد نماید.
- Maxvalue :بیشترین مقداری که Sequence میتواند ایجاد نماید.
- Cycle :مقداری را که برای Cycle تعیین مینماییم، بدین مفهوم است که Sequence پس از چه عددی میبایست Restart شود.
- Cache :عددی که برای Cache در نظر میگیریم، مفهومش این است که چه تعداد از اعداد تولید شده توسط Sequence، قبل از استفاده، میتواند در Cache قرار گیرد.
در ادامه با یک مثال ساده، یک Sequence ایجاد مینماییم:
CREATE SEQUENCE [dbo].[SequenceTest] AS [int] START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 30 CYCLE CACHE GO
برای اینکه بتوانیم مقدار Sequence را بدست آوریم، کافیست از Syntax زیر استفاده نمایید:
NEXT VALUE FOR [ database_name . ] [ schema_name . ] sequence_name [ OVER (<over_order_by_clause>) ]
اگر Select بالا را تا 30 بار انجام دهید، برای دفعه 31 مقدار آن یک میشود، چون در زمان تعریف Cycle ،Sequence را انتخاب کرده بودیم. در غیر اینصورت برای دفعه 31 با خطا زیر مواجه میشوید.
Msg 11728, Level 16, State 1, Line 1 The sequence object 'SequenceTest' has reached its minimum or maximum value. Restart the sequence object to allow new values to be generated.
در ابتدا مطابق Script زیر جدولی را ایجاد و مقادیری را درون آن درج مینماییم:
create table Kids ( ID int, Name varchar(50) ); Go insert Kids values (1,'Emma') , (1,'Tabitha') , (2,'Kendall') , (3,'Delaney') , (4,'Kyle') , (5,'Jessica') , (6,'Josh') , (7,'Kirsten') , (8,'Amanda') , (9,'Jimmy') ;
CREATE SCHEMA Samples ; GO
CREATE SEQUENCE Samples.Test AS tinyint START WITH 1 INCREMENT BY 1 ; GO
SELECT NEXT VALUE FOR Samples.Test OVER (ORDER BY Name) AS NutID, ID, Name FROM test1.Kids WHERE Name LIKE '%e%' ;
امیدوارم مطلب فوق مفید واقع شده باشد.
استفاده از StructureMap به عنوان یک IoC Container
مراحل تنظیم Let's Encrypt در IIS
website -> SSL Settings -> Client Certificates -> Select `Ignore`: This is the default option.