آشنایی با IdentityServer
برای پیاده سازی اعتبار سنجی و تایید هویت بر مبنای توکن، ما با استفاده از
یک چارچوب نرم افزاری سورس باز (منبع باز) به نام IdentityServer یک سرویس
توکن ایجاد خواهیم کرد. در حال حاضر IdentityServer4 آخرین نسخه توصیه شده
برای برنامه های Asp.Net Core است. اجازه دهید قبل از ورود به پیاده سازی،
مفاهیم و اصطلاحات اصلی درگیر با موضوع را مرور کنیم.
این نمودار قسمت های اصلی سیستم امنیتی ما را نشان می دهد. مشتری نرم
افزاری است که توکن های مورد نیاز خود را از IdentityServer درخواست می
کند. به عنوان مثال این مشتری می تواند یک برنامه وب یا موبایل
باشد. IdentityServer باید بداند که چه مشتریانی مجاز به استفاده از آن
هستند. و این کار از طریق ثبت مشتریان در یک مجموعه ای از موجودیت ها و یا
یک محل ذخیره سازی انجام می گیرد. این مجموعه می تواند در یک حافظه و یا
بانک اطلاعاتی قرار بگیرد.
سپس کاربران نهایی هستند که با برنامه های مشتری در تعامل هستند. آنها
همچنین باید توسط IdentityServer ثبت گردند. کاربران با داده های هویتی
مانند شناسه منحصر به فرد، نام کاربری و رمز عبور تعریف می شوند. آنها
همچنین می توانند یک و یا چند claim مرتبط نیز داشته باشند. منابع مواردی
هستند که ما می خواهیم از آنها محافظت کنیم، و آنها به دو دسته هویت
(Identity) و API تقسیم می شوند. منابع هویتی همانند claim های کاربر،
اطلاعاتی در مورد هویت کاربر هستند. منابع API عملکرد های محافظت شده مانند
API های وب می باشند. همچنین منابع باید در یک محل ذخیره سازی در Identity
Server ثبت گردند. در کنار دو نوع منبع، دو نوع توکن وجود دارد که باید
تولید گردند.
هنگامی که یک کاربر توسط IdentityServer تایید هویت می شود، اطلاعات به
توکن هویت (Identity Token) بازگردانده می شوند. هنگامی که دسترسی به یک
منبع API درخواست می گردد، توکن دسترسی صادر می گردد. مشتری توکن دسترسی را
به API منتقل می کند، که اجازه دسترسی به داده ها یا عملکرد های محافظت شده
را می دهد. IdentiyServer از توکن های استاندارد JWT استفاده می کند.
IdentityServer در هسته مرکزی خود، یک میان افزاری است که دو پروتوکل
استاندارد OpenID و OAuth 2 را پیاده سازی می کند. OpenID Connect یک
پروتوکل تایید اعتبار است و یک افزونه در مراحل بالای OAuth 2 است. OAuth 2
نیز یک استاندارد باز برای تعیین سطوح دسترسی و مجوز است. این تضمین می کند
که یک کاربر اجازه دسترسی به یک منبع محافظت شده را دارد. با استفاده از
OAuth 2، مشتری می تواند توکن دسترسی را از یک سرویس توکن امنیتی درخواست کند. سپس این توکن ها برای برقراری ارتباط با API ها استفاده می
شوند. از طریق پیاده سازی این دو استاندارد، IdentityServer قادر است
الزامات امنیتی مربوط به تایید اعتبار و تعیین سطوح دسترسی را اعمال
کند.
حال که در مورد مفاهیم، مطالبی را توضیح دادیم، اجازه دهید با تنظیمات و راه
اندازی اولیه شروع کنیم.
ما با اضافه کردن یک پروژه جدید به solution شروع خواهیم کرد. در ادامه یک
پروژه وب از نوع Asp.Net Core انتخاب کنید.
و یک نام برای آن انتخاب کنید، ما اسم پروژه را
Tutorial.AspNetSecurity.TokenService قرار می دهیم. و در این صفحه، گزینه
Empty را انتخاب فرمایید.
در ادامه، ما بسته IdentityServer4 را از طریق مدیریت بسته های Nuget
به پروژه خود اضافه خواهیم کرد. روی پروژه کلیک راست کرده و منوی
Manage Nuget Package را کلیک کنید.
در پنجره جستجو عبارت IdentityServer4 را وارد نمایید.
پیش بروید و بسته را نصب نمایید.
در صورتی که با خطا مواجه شدید، نسخه دات نت پروژه خود را به نسخه مورد
نیاز IdentityServer4 تغییر دهید.
حال ما آماده نوشتن کد های مربوط به ایجاد وابستگی های IdentityServer
هستیم.
کلاس startup.cs را که در ریشه پروژه قرار دارد باز کنید و سپس متد
ConfigureServices را پیدا کنید. ما با فراخوانی متد
AddIdentityServer ، می توانیم IdentityServer را رجیستر نماییم. سپس متد
AddDeveloperSigningCredential را فراخوانی می کنیم، در نسخه های قبلی به
جای این متد، متد AddTemporarySigningCredential وجود داشت.
AddDeveloperSigningCredential یک کلید موقتی در زمان راه اندازی
ایجاد می کند، این کلید برای سناریوهای زمان پیاده سازی طراحی شده است،
این کلید ایجاد شده به طور پیش فرض در پوشه محلی قرار خواهد گرفت.
AddTemporarySigningCredential نیز کلید های موقتی را برای توکن های
ورود، استفاده آنها و گواهی های داخل حافظه ایجاد می کند. از این متد ها
فقط در زمان پیاده سازی و یا دموی نرم افزار که مجوز استفاده از نرم افزار
وجود ندارد، استفاده می شود. در محیط واقعی محصول، IdentityServer برای
ورود و اعتبار سنجی و تایید توکن های jot نیاز به یک جفت کلید عمومی/خصوصی
دارد.
حال به سراغ متد configure می رویم. در این متد می توانیم کدهای اضافه
مانند کد زیر را پاک کنیم، این کد توسط قالب های پیش فرض ایجاد پروژه، اضافه
می گردد:
app.Run(async context =>
{
await context.Response.WriteAsync("Hello, World!");
});
ادامه می دهیم و به روال های برنامه IdentityServer را اضافه می کنیم، بدین
نحو که در متد Configure کد
app.UseIdentityServer();
را اضافه می کنیم. توصیه می کنیم برای زمان توسعه، به جای استفاده از IIS
از میزبانی کنسول(console host) یا به زبان دیگر از میزبانی در خود پروژه استفاده کنیم
تا بتوانیم از امکانات خروجی های لاگ لحظه ای استفاده نماییم. ما می توانیم
این کار را با تغییر مشخصه راه اندازی در Visual Studio انجام دهیم. برای
انجام این کار، به سراغ صفحه تنظیمات و ویژگی های پروژه(project
properties) می رویم و سپس به سراغ تب Debug می رویم:
مورد انتخاب شده در منوی آبشاری profile را به خود پروژه تغییر می دهیم و
همچنین مورد انتخاب شده در منوی آبشاری Launch را نیز به project تغییر می
دهیم. از آنجا که ما نحوه میزبانی پروژه را به خود-میزبانی(self-hosting)
تغییر داده ایم، لازم است پورت استفاده شده در App Url را به 5000 تغییر
دهیم. نکته ای که باید در نظر داشته باشیم این است که وقتی به محیط واقعی
برنامه می رویم باید اطمینان حاصل کنیم که سرویس توکن ما روی اتصال امن
HTTPS اجرا می شود. هنوز برای راه اندازی سرویس توکن آماده نیستیم، برای
پشتیبانی از سرویس اعتبار سنجی، ابتدا باید Identity Server را پیکربندی
نماییم.