کتابخانه Asp.net Core Identity چیست و چگونه طراحی شده است؟

بررسی معماری Asp.net Core Identity

  • ایمان محمدی
  • ‫۸ ماه قبل، پنج شنبه ۱ آبان ۱۳۹۹، ساعت ۱۱:۰۰
  • برنامه نویسی سمت سرور

از نسخه های اولیه فریمورک .Net همواره سعی شده است که ابزاری برای احراز هویت در دسترس برنامه نویسان باشد. تاریخچه Asp.net Core Identity را می توانید اینجا مطالعه کنید. احراز هویت موضوع بسیار مهمی است و نیاز به بروز رسانی مداوم و رعایت نکات فراوانی دارد که معمولا از عهده برنامه نویسان خارج است. در فریمورک .Net این موضوع به دقت و جزئیات فراوان پیاده سازی شده است که در ادامه معماری آن را بررسی خواهیم کرد.

سوال Aps.net Identity Core چیست ؟

آخرین نسخه از کتابخانه احراز هویت مایکروسافت در .Net Framework است که قابلیت های زیر را شامل می شود:

  • ثبت نام کاربر - User Registration
  • احراز هویت - Authentication
  • اعتبار سنجی - Authorization
  • باز نشانی رمز عبور - Reset Password
  • تایید حساب - Account Confirmation
  • احراز هویت توسط ارائه دهنده های خارجی - External Provider Login
  • احراز هویت چند عاملی - Multi-Factor Authentication
  • اعتبار سنجی نام کاربری - User Validator
  • اعتبار سنجی رمز عبور - Password Validator
  • مسدود سازی کاربر - User Lockout
  • درهم سازی رمز عبور - Password Hashing
  • رمز نگاری اطلاعات کاربر - Protected Personal Data

همه این قابلیت های طوری طراحی شده است که بسیار قابل تنظیم و تغییر هستند و شما کنترل کاملی بر آنها دارید و هرآنچه نیاز باشد به راحتی می توانید به ساختار آن اضافه کنید. نکته بسیار مهم این است که ما با کمترین دانش درباره امنیت، بیشترین قابلیت توسعه را در سیستم احراز هویت Asp.net Core Identity دارا هستیم.

در ادامه بهتر است بدانیم که Asp.net Identity Core چه اطلاعاتی در اختیار اپلیکیشن ما قرار می دهد. این ها اطلاعاتی هستند که تغییر روزانه ندارند و داده های هستند که شامل اطلاعات اپلیکیشن ما نیستند:

  • اطلاعات شناسایی (Identification) : نام کاربری، رمز عبور و کلیدهای های احراز هویت چند عاملی و ...
  • اطلاعات شخصی (Personal Information ) : نام و نام خانوادگی، جنسیت، تاریخ تولد، ایمیل، آدرس 
  • نقش (Role) : نقش یک کاربر در یک سازمان یا شغل

نکته مهم، دسترسی ها (Permissions) در Asp.net Identity Core تعریف نشده است.


ساختار Asp.net Identity Core

برای بررسی راحت تر این موضوع ما کتابخانه های موجود در Asp.net Identity Core را به سه دسته زیر تقسیم می کنیم:

لایه Stores :

شامل IUserStore و IRoleStore می باشد. به عبارتی این لایه Access Data است. آنها جزئیات کار با دیتابیس را حذف می کنند تا معماری بقیه اجزا تحت تاثیر خود قرار نگیرد و همچنین به ما اجازه می دهد نوع پایگاه داده را تغییر دهیم بدون اینکه سایر قسمت ها نیاز به تغییری داشته باشند. 

لایه Mangers :

شامل UserManagerوRoleManager می باشد. آنجایی است که منطق برنامه یا Business Logic در آن تعریف شده است و قابلیت هایی چون اعتبار سنجی قوانین نام کاربری و یا درهم سازی رمز عبور در آن قرار دارد. لایه مدیران در حقیقت دروازه ورود به Asp.net Core Identity است که بیشتر کارها توسط آنها انجام می شود.

لایه Extensions :

این لایه نهایی رو می توانیم Extensions نام گذاری کنیم. در اینجا ما کلاس هایی داریم که منطق درون لایه مدیران را خلاصه می کنند و ارتباط با کتابخانه های بیرونی را برقرار میکنند. به عنوان مثال SigninManger یک کلاس ساده است که در درون خود متدهای مختلف UserManger را فراخوانی می کند و سپس براساس نتایح، کوکی ها را به صورت خودکار صادر می کند و منطق احراز هویت را برای برنامه ساده می کند.


برای این لایه ها موجودیت های مشترک User و Role وجود دارد که نمایان گر کاربران و نقش های آنان است. این موجودیت ها می توانند با ساختار ذخیره شده در پایگاه داده متفاوت باشند ولی باید خروجی Store های تعریف شده باشند. این موجودیت ها در بخش های مختلف کتابخانه Asp.net Core Identity استفاده می شوند.


کتابخانه های Asp.net Identity Core

به چهار کتابخانه اصلی زیر تقسیم می شود که در دو کتابخانه اول تمام اینترفیس ها و پیاده سازی های اولیه قرار داده شده است :

کتابخانه Microsoft.Extensions.Identity.Core :

تمام اینترفیس ها و پیاده سازی های اولیه در این کتابخانه قرار داده شده است. Manager ها همراه با پیاده سازی پیش فرض منطق های لازم از جمله PasswordHasher و EmailTokenProvider و PhoneNumberTokenProvider به همراه همه کلاسه های Options در این کتابخانه قرار دارند.

کتابخانه Microsoft.AspNetCore.Identity :

موارد مرتبط با Asp.Net در این کتابخانه قرار داده شده است. از مهم ترین آنها می توان SignInManager و SecurityStampValidator و تمام تعاریف مرتبط با کوکی نام برد. برای پیاده سازی نسخه شخصی سیستم احراز هویت همین دو کتابخانه کافی است و به صورت پیش فرض در فریمورک قرار دارند.

کتابخانه Microsoft.Extensions.Identity.Stores :

این کتابخانه کاملا مرتبط با ذخیره سازی است و موجودیت های پایه از جمله کاربر و نقش اینجا تعریف شده است. همچنین نسخه پیاده سازی شده با Entity Framework از این ساختار تبعیت می کند و به صورت پیش فرض در فریمورک قرار دارد. 

کتابخانه Microsoft.AspNetCore.Identity.EntityFrameworkCore:

این کتابخانه ارایه دهنده نسخه Identity بر رویEntity Framework core می باشد و با استفاده از DbContext برای دسترسی به داده ها، پیاده سازی کاملی از UserStore و RoleStore برای این موجودیت ها ارایه کرده است. برای استفاده از آن باید پکیج Nuget آن را بر روی پروژه نصب کنید. در زمان نوشتن این مقاله آخرین نسخه آن 5.0.0 Rc2  است.


بررسی اینترفیس ها و کلاس های مهم Asp.net Identity Core

مهم ترین کلاس Asp.Net Identity Core کلاس User Manager است که تقریبا تمام کارهای مورد نیاز توسط بیش از 80 متد عمومی آن انجام می شود. با توجه به کلاس سازنده آن نیازمند های اصلی آن را بررسی می کنیم.

UserManager(IUserStore<TUser> store, 

IOptions<IdentityOptions> optionsAccessor, 

IPasswordHasher<TUser> passwordHasher, 

IEnumerable<IUserValidator<TUser>> userValidators, 

IEnumerable<IPasswordValidator<TUser>> passwordValidators,

ILookupNormalizer keyNormalizer,

IdentityErrorDescriber errors, 

IServiceProvider services, 

ILogger<UserManager<TUser>> logger)

...

اینترفیس IUserStore :

همانطور که پیش تر اشاره کردیم وظیفه دسترسی به داده های پایگاه داده را به عهده دارد و در نقش یک Repository عمل می کند و عملیات های Crud را به عهده دارد.


اینترفیس IPasswordHasher :

وظیفه درهم سازی رمز عبور را دارد و از پیاده سازی پیش فرض PasswordHasher استفاده شده است. در این کلاس از Pbkdf2 برای درهم سازی رمز عبور با Iteration=10000 استفاده می شود می توانید توسط PasswordHasherOptions تعداد IterationCount را تغییر دهید و یا جهت سازگاری با نسخه های قبلی CompatibilityMode را تنظیم کنید.

 

اینترفیس IUserValidator :

در این کلاس تمام کارهای اعتبارسنجی نام کاربری از خالی نبودن و طول نام گرفته تا تکراری نبودن نام کاربری توسط متد ValidateAsync انجام می گیرد. 


اینترفیس IPasswordHasher :

توسط پیاده سازی این کلاس تنظیمات مرتبط با رمز عبور اعتبارسنجی می شود. تنظیمات PasswordOptions شامل طول رمز عبور پیچیدگی رمز عبور با تعیین اجباری بودن حروف بزرگ و کوچک و اعداد و علامت های خاص توسط متد ValidateAsync انجام می گیرد. 


اینترفیس ILookupNormalizer :

شامل دو متد نرمال سازی نام کاربری و نرمال سازی ایمیل می باشد. پیاده سازی پیش فرض آن کلاس UpperInvariantLookupNormalizer می باشد که با بزرگ کردن همه حروف و فراخوانی متد String.Normalize() کار خود را انجام می دهد.


کلاس IdentityErrorDescriber :

این کلاس به منابع انگلیسی آن اشاره دارند در صورتی که بخواهیم پیغام های Asp.Net Identity Core را تغییر دهیم باید از این کلاس استفاده کنیم.


کلاس IRoleStore :

مشابه اینترفیس IUserStore وظیفه دسترسی به داده های پایگاه داده را به عهده دارد و در نقش یک Repository عمل می کند و عملیات های Crud را به عهده دارد.


برای استفاده از این ساختار نیاز به پیاده سازی و پیکر بندی آن داریم. خوشبختانه پیاده سازی آن بر روی Entity Framework در دسترس ما قرار دارد و با نصب پکیچ های آن می توانیم از آن استفاده کنیم. شرح استفاده و بررسی آن از حوصله این مقاله خارج است و در مقالات بعدی به بررسی آن خواهیم پرداخت. همچنین اطلاعات و آموزش های کاملی برای استفاده از Asp.Net Iddentity core در سایت مایکروسافت و سایت dotnettips قرار دارد.