موضوع امنیت که در این درس از آموزش متنی معماری وب اپلیکیشنهای Asp.Net Core از وب سایت پرووید به شما تقدیم می گردد یک موضوع بسیار مهم می باشد. ایجاد امنیت در وب اپلیکیشن ها یک موضوع بسیار گسترده به حساب میآید که میبایست از جهات مختلفی مورد بررسی قرار بگیرد. در ساده ترین شکل ممکن امنیت شامل پیاده سازی Authentication و Authorization است. منظور از Authentication این است که با بررسی Username و پسورد اصطلاحاً به آن ها credential های یک کاربر نیز میگویند اطمینان حاصل کنیم که Request وارد شده به وب اپلیکیشن قابل اعتماد است و از طرف کاربری می آید که هویت آن مشخص است. به عبارت دیگر Authentication به معنی تشخیص هویت کاربری است که Request مورد نظر را درخواست کرده است. جنبه دیگر لحاظ کردن امنیت در یک وب اپلیکیشن پیادهسازی کردن Authorization می باشد. با استفاده از Authorization ما میتوانیم دسترسی Request ها را به Resource های مختلفی که در برنامه وجود دارند بر اساس user identity محدود کنیم. جنبه دیگر پیاده سازی امنیت در وب اپلیکیشن ها محافظت کردن از Request ها در برابر سرقت و یا اصطلاحاً eavesdropping می باشد. در چنین شرایطی می بایست در سطح حداقلی SSL را در وب اپلیکیشن پیاده سازی کنیم. در ادامه به طور مفصل تری در رابطه با پیادهسازی مباحث امنیتی در وب اپلیکیشن ها صحبت خواهیم کرد.
بررسی مکانیسم Authentication در وب اپلیکیشن ها
فریم ورک ASP.NET Core Identity در واقع یک سیستم membership است که میتواند مکانیسمهای Login کردن را به برنامه اضافه کند. با استفاده از این سیستم شما میتوانید user account های محلی و علاوه بر این login provider های external را برای Login کردن کاربر با اکانت هایی بر روی سیستم هایی از قبیل Microsoft Account و Twitter و فیسبوک و گوگل و غیره را لحاظ کنید. علاوه بر ASP.NET Core Identity برنامه میتواند از windows authentication و یا یک identity provider دیگر از قبیل Identity Server استفاده کند. در رابطه با این موضوع ها در بسته ی آموزش ویدئویی مباحث Authentication و Authorization در ASP.NET Core صحبت کردهایم.
سیستم ASP.NET Core Identity را میتوان در زمان ایجاد کردن یک وب اپلیکیشن با لحاظ کردن گزینه Individual User Accounts به برنامه اضافه کرد. با انجام این کار شما قابلیت هایی از قبیل Register کردن و Login کردن و external login ها و forgotten password و دیگر قابلیت های مورد نظرتان در رابطه با مباحث امنیتی را به برنامه اضافه خواهید نمود. این موضوع در تصویر زیر نشان داده شده است:
علاوه بر این موضوع با استفاده از متدهای ConfigureServices و Configure در کلاس Startup می توانیم پیکربندی های مربوط به Identity را شبیه به کد زیر لحاظ کنیم :
یکی از نکات مهم استفاده کردن از متد UseIdentity قبل از متد UseMvc در متد Configure می باشد. علاوه بر این در زمان پیکربندی کردن identity در متد ConfigureServices شما می توانید یک فراخوانی به متد AddDefaultTokenProviders را نیز مشاهده کنید. علیرغم چیزی که برنامه نویسان تصور میکنند این متد ربطی به توکن هایی که برای پیاده سازی امنیت در ارتباطات سطح وب مورد استفاده قرار میگیرند ندارد. در واقع این متد برای لحاظ کردن ارسال پیامک و یا ایمیل به کاربران به منظور تایید کردن هویت آنها می باشد.
بررسی مکانیسم Authorization در وب اپلیکیشن ها
ساده ترین شکل Authorization محدود کردن دسترسی anonymous users ها می باشند. این موضوع را میتوانیم با لحاظ کردن یک Attribute به نام [Authorize] در سطح Controller ها و یا Action Method های مختلف به دست بیاوریم. اگر از Role ها نیز استفاده میکنید میتوانید در لحاظ کردن این Attribute دسترسی را به کاربرانی که عضو یک Role هستند محدود کنید. این موضوع در کد زیر نشان داده شده است:
بر اساس کد بالا کاربرانی که به یکی از Role های HRManager و یا Finance متعلق باشند میتوانند به SalaryController دسترسی پیدا کنند. اگر بخواهید دسترسی را به کاربرانی بدهید که عضو چندین Role مختلف هستند می بایست که این Attribute را چندین بار لحاظ کنید و بر هر کدام از آنها Role مورد نظر خود را تعریف نمایید.
لحاظ نمودن مجموعهای از Role ها در قالب string در Controller ها و Action های مختلف میتواند باعث تکراری شدن کدها شود. برای پیکربندی کردن بهتر این کار میتوانیم از Authorization Policy ها استفاده کنیم و با استفاده از آنها Authorization rule ها و یا قوانین Authorizationرا کپسوله سازی نماییم. پس از انجام این کار میتوانیم به جای لحاظ کردن Role ها به صورت تک تک از این Policy ها در کنار [Authorize] استفاده کنیم. این موضوع در کد زیر نشان داده شده است:
با استفاده از Policy ها به روشی که در قسمت بالا دیدید می توانیم انواعی از Action method ها که محدود میشوند را از Role ها و یا قوانینی که بر روی آنها اعمال میشوند تفکیک کنیم. بعد از انجام این کار اگر بخواهید یک Role جدید را تعریف کنید که نیاز به دسترسی به Resource های خاصی داشته باشد فقط نیاز به بروزرسانی کردن Policy مورد نظر دارید و دیگر نیازی نیست که در هر کجا که از [Authorize] استفاده کرده اید تغییری ایجاد کنید.
بررسی Claim ها
یکی دیگر از ماهیت هایی که در Authentication و Authorization در Asp.Net Core کاربرد دارد استفاده کردن از Claim ها می باشد. در واقع Claim ها از دو بخش نام و مقدار تشکیل شده اند و نمایانگر پروپرتی های یک کاربر Authenticate شده می باشند. برای مثال شما می توانید کد پرسنلی کارمندان خود را در قالب یک Claim ذخیره کنید. پس از انجام این کار Claim ها می توانند در Policy Authorization ها مورد استفاده قرار بگیرند. فرض کنید که یک Policy به نام EmployeeOnly تعریف کرده اید که نیاز به موجود بودن یک Claim به نام EmployeeNumber دارد. این موضوع در کد زیر نشان داده شده است:
پس از تعریف شدن این Policy می توانیم آن را در کنار [Authorize] برای محافظت کردن از controller ها و action ها استفاده کنیم.
ایجاد امنیت در Web API ها
بسیاری از Web API ها نیاز دارند که یک سیستم authentication مبتنی بر توکن و یا اصطلاحا token-based authentication system را پیاده سازی کنند. با استفاده از روش Token authentication که به صورت stateless و کاملاً مقیاس پذیر کار می کند یک کلاینت در ابتدا مکانیسم authentication خود را با استفاده از یک authentication provider و یا فراهم کننده سرویس authentication انجام میدهد. اگر روال authentication با موفقیت انجام شود کلاینت یک توکن را دریافت می کند. یک توکن به بیان ساده یک رشته از کاراکتر های رمز شده می باشد. زمانی که کلاینت نیاز به ارسال کردن یک Request دارد توکن مورد نظر را در Header مربوط به آن Request قرار میدهد و سپس آن Request را به سرور ارسال میکند. سرور توکن را دریافت کرده و سپس بر اساس معتبر بودن و یا عدم اعتبار آن توکن درخواست کاربران را پاسخ می دهد. در رابطه با این موضوع در بسته ی آموزش ویدئویی پیاده سازی امنیت در Web API در ASP.NET Core و آموزش ویدئویی کار با ASP.NET Web API 2 و Entity Framework 6 بیشتر صحبت کرده ایم. تصویر زیر مکانیزم token-based authentication را به شما نشان می دهد:
به منظور استفاده کردن از یک authentication service میتوانیم از Azure AD و یا OAuth استفاده کنیم. پیاده سازی کردن یک سرویس با استفاده از یک ابزار اپن سورس به نام IdentityServer نیز امکان پذیر است. در رابطه توصیه میکنیم از بسته ی آموزش ویدئویی مباحث Authentication و Authorization در ASP.NET Core نیز دیدن کنید.
پیادهسازی مباحث امنیتی به صورت سفارشی
بسیاری از کاربران و برنامه نویسان به سمت پیاده سازی کردن مکانیزم های رمزگذاری و سیستم Membership خاص خود میروند. این روش اغلب توصیه نمیشود چرا که ابزارهای open-source و تجاری زیادی وجود دارند که می توانند بسیاری از این موضوعات از قبیل روند ایجاد توکن ها، رمزنگاری کردن آنها و سیستم Membership را در اختیار شما قرار بدهند. چنین ابزارهای به مراتب بهتر از استفاده کردن از ابزارهای نوشته شده توسط خود برنامه نویس است.