اخبار، مطالب و رویدادهای مرتبط با توسعه نرم افزار رادکام

ایمن سازی برنامه ها با استفاده از احراز هویت بر مبنای توکن - بخش دوازدهم - راه اندازی و مقدار دهی اولیه بانک اطلاعاتی Identity Server

راه اندازی و مقدار دهی اولیه بانک اطلاعاتی Identity Server

 ما Identity Server را برای استفاده از Identity Framework پیکربندی کردیم و حال آماده ایم تا دستورات Migration مربوط به دیتابیس را اجرا کنیم. برای این کار Command Prompt را باز می کنیم. نیاز داریم تا با استفاده از دستور cd به سراغ پوشه ای برویم که پروژه Token Service داخل آن است. سپس دستور زیر را اجرا می کنیم:

dotnet ef migrations add InitialIdentityServerPersistedGrantDbMigration -c PersistedGrantDbContext -o Data/Migrations/IdentityServer/PersistedGrantDb

Initialize IdentityServer database - PersistedGrantDbContext
ممکن است خطایی مشابه خطای زیر دریافت نمایید.
 

Method 'get_Info' in type 'Microsoft.EntityFrameworkCore.Infrastructure.Internal.SqlServerOptionsExtension' from assembly 'Microsoft.EntityFrameworkCore.SqlServer, Version=2.0.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60' does not have an implementation.

دراین صورت نسخ Microsoft.EntityFrameworkCore.SQLServer را به (3.1.2) ارتقاء دهید.

 و نیز ممکن است خطای زیر را دریافت کنیم:

Value cannot be null. (Parameter 'connectionString')

در این صورت باید ConnectionString های مورد نیاز را در فایل appsettings.json تعریف کنیم، بدین صورت:


{
"ConnectionStrings": {
"TokenService": "Server=(localdb)\\mssqllocaldb;Database=TokenService;Trusted_Connection=True;MultipleActiveResultSets=true",
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=TokenService;Trusted_Connection=True;MultipleActiveResultSets=true"
},

"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}

 

و سپس دستور زیر را اجرا می کنیم:

dotnet ef migrations add InitialIdentityServerConfigurationDbMigration -c ConfigurationDbContext -o Data/Migrations/IdentityServer/ConfigurationDb
 
Initialize IdentityServer database - ConfigurationDbContext

نیاز بود تا برای هر کدام از محل های ذخیره سازی اطلاعات مربوط به Identity Server یک بار دستور Migration را اجرا کنیم. اولین دستوری که اجرا شد برای بانک اطلاعاتی مربوط به   PersistedGrantDbContext هست، و دومین دستور نیز برای بانک اطلاعاتی پیکربندی Identity Server می باشد. حال که این دستورات را اجرا کردیم، باید ببینیم پوشه های مربوطه و همچنین کد های مربوط به Migration در پوشه Data ایجاد شده اند یا نه.

Initialize IdentityServer database - Data Folder
همانطور که مشاهده می کنید، هر دو پوشه و فایل های migration داخل آنها برای هر دو نوع بانک اطلاعاتی ایجاد شده اند. برای ایجاد شمای دیتا بیس و مقدار دهی اولیه به یک متد کمکی نیاز داریم. به سراغ انتهای کلاس Startup.cs رفته و کد زیر را در انتهای فایل اضافه می کنیم. و متد InitializeDatabase(app) را در ابتدای متد Configure فراخوانی می کنیم.

private void InitializeDatabase(IApplicationBuilder app)
{
	using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
	{
		serviceScope.ServiceProvider.GetRequiredService<PersistedGrantDbContext>().Database.Migrate();

		var context = serviceScope.ServiceProvider.GetRequiredService<ConfigurationDbContext>();
		context.Database.Migrate();
		if (!context.Clients.Any())
		{
			foreach (var client in Config.GetClients())
			{
				context.Clients.Add(client.ToEntity());
			}
			context.SaveChanges();
		}

		if (!context.IdentityResources.Any())
		{
			foreach (var resource in Config.GetIdentityResources())
			{
				context.IdentityResources.Add(resource.ToEntity());
			}
			context.SaveChanges();
		}
	}
}
برای رفع خطای کامپایل و استفاده از امکانات این متد باید کتابخانه IdentityServer4.EntityFramework.DbContexts , IdentityServer4.EntityFramework.Mappers را به بالای کلاس خود اضافه کنیم. بیایید نگاهی دقیقتر به آنچه در درون این متد وجود دارد بیاندازیم.
ما متد migrate را برای هر دوی DbContext ها فراخوانی می کنیم. که اگر دیتابیس مربوطه ایجاد نشده بود، ابتدا آنها را ایجاد کند. همانطور که مشاهده می کنید خط کد زیر برای ایجاد دیتابیس مربوط به PersistedGrantDb نوشته شده است.

serviceScope.ServiceProvider.GetRequiredService().Database.Migrate();		
و خط زیر نیز برای ایجاد دیتابیس مربوط به پیکربندی:

var context = serviceScope.ServiceProvider.GetRequiredService();
context.Database.Migrate();
در ادامه ما دیتای مربوط به client را مقدار دهی اولیه می کنیم.  برای اینکار از متد های استاتیک  GetClients و  GetIdentityResources که به کلاس Config اضافه کرده بودیم بهره می بریم. حال باید برای مقدار دهی اولیه دیتابیس، متد مربوطه را در متد Configure فراخوانی کنیم. در ابتدای متد Configure، متد  InitializeDatabase را فراخوانی می کنیم. فقط باید شیء app را به عنوان پارامتر ورودی این متد قرار دهیم. حال که ما تمام کد هایی که  برای مقدار دهی اولیه دیتابیس نیاز داشتیم را پیاده سازی کردیم،  پروژه Token Service را اجرا می کنیم. بعد از اجرای پروژه، به سراغ Visual Studio رفته و از منوی View کمک گرفته و  Sql Server Object Explorer را باز می کنیم. در زیر (localdb)\MSSQLLocalDB به سراغ دیتابیس TokenServiceمی رویم، این بانک اطلاعاتی است که تازه ایجاد شده است.
دیتا بیس TokenService را باز می کنیم تا جداولی که داخل آن با موفقیت ایجاد شده اند را ببینیم.

Initialize IdentityServer database - Sql Server Object Explorer

به سراغ جدول clients می رویم، تا مقادیر اولیه ای را که در کد برای درج در این جدول قرار داده بودیم ببینیم. همانطور که مشاهده می کنید یک رکورد در جدول Clients برای Roux Academy client درج شده است.

Initialize IdentityServer database - Clients Data-min

دوباره به سراغ کلاس startup.cs رفته و نگاهی به متد ConfigureServices می اندازیم. همانطور که می بینید، ما هنوز از کاربران آزمایشی استفاده می کنیم و Identity Server محل ذخیره سازی درون برنامه ای برای کاربران تعبیه نکرده است. بنابراین از هر نوع محل ذخیره سازی که مورد نظر شما باشد می توان برای کاربران بهره برد. برای شروع Identity Server پیشنهاد می دهد تا از ASP.net Core Identity استفاده کنیم. در لینک زیر مثالی برای چگونگی این کار و ادغام IdentityServer و ASP.net Core Identity وجود دارد.
http://docs.identityserver.io/en/release/quickstarts/6_aspnet_identity.html

به عنوان یک آزمایش نهایی، به سراغ Visual Studio رفته و پروژه های webclient و TokenService را اجرا می کنیم، مطمئن باشید تا اجرای همزمان دو پروژه را انتخاب کرده باشید. می خواهیم ببینیم ورود به Identity Server و خروج از آن هنوز به درستی کار می کند. با همان نام کاربری alice و همان رمز عبور وارد می شویم. همانطور که می بینید، در صفحه اول وب سایت همه چیز مثل سابق است و اگر روی منوی student portal کلیک کنیم، به سمت صفحه لاگین هدایت می شویم و با استفاده از شناسه کاربری alice و رمز عبور alice وارد می شویم  و در صفحه خانه نیز بعد از لاگین اطلاعات سابق مربوط به claim های کاربر نمایش داده می شود. با استفاده از لینک Logout از بخش وارد شده نیز خارج می شویم. بنابراین هر دو پروژه مانند قبل به درستی کار می کنند. تنها تفاوت این است اطلاعات مربوط به پیکربندی در یک پایگاه داده محلی، ذخیره می شوند.

منبع:

Lynda.com - ASP.NET.Core.Security


نام را وارد کنید
تعداد کاراکتر باقیمانده: 1000
نظر خود را وارد کنید