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

ایمن سازی برنامه ها با استفاده از احراز هویت بر مبنای توکن - بخش یازدهم - پیکربندی IdentityServer برای استفاده از EntityFramework

پیکربندی IdentityServer برای استفاده از EntityFramework

تا کنون اطلاعات پیکربندی مورد نیاز IdentityServer را در حافظه نگهداری می کردیم، اما این کار فقط در اهداف نمایشی و برای نسخه های دموی یک نرم افزار کاربرد دارد. در دنیای واقعی به یک مکانیسم ذخیره سازی ماندگار نیاز داریم. پیاده سازی های انجام شده فعلی را با نسخه پیاده سازی شده با Entity Framework Core جایگزین خواهیم کرد. برای ارائه دهنده پایگاه داده از نسخه لوکال SQL Server استفاده می کنیم. Identity Server یک بسته نرم افزاری  از Entity Framework را ارائه می دهد که از ذخیره سازی اطلاعات سرویس گیرنده ها ، منابع و داده های عملیاتی پشتیبانی می کند.
بیایید پیش برویم و آن را نصب کنیم.

Configure IdentityServer to use Entity Framework - Install Identity Server4 Enityframework

از آنجا که ما از SQL Server به عنوان ارائه دهنده پایگاه داده استفاده می کنیم، نیاز هست که چند بسته نرم افزاری دیگری را نیز نصب کنیم.
ادامه داده و بسته Entity Framework Core SQL Server نسخه 1.1.2 را نصب می کنیم. و سپس بسته Entity Framework Core Tools نسخه 1.1.1 را نصب می کنیم. در آینده برای مهاجرت از نسخه فعلی دیتابیس به نُسَخ بالاتر یا حرفه ای تر نیاز پیدا خواهیم کرد تا فایل پروژه Token Service را ویرایش کنیم.

Configure IdentityServer to use Entity Framework - Edit Project File

در انتهای فایل پروژه (Tutorial.AspNetSecurity.TokenService.csproj) یک  ItemGroup برای DotNetCliToolReference ایجاد می کنیم. کد زیر را به انتهای فایل پروژه اضافه می کنیم:

<ItemGroup>
	<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.0" />
</ItemGroup>
کاری که این تکه کد انجام می دهد نصب ابزار Command Line برای Entity Framework است. رشته اتصال بانک اطلاعاتی (connection string) ما  در فایل جیسون مربوط به تنظیمات ذخیره خواهد شد.

Configure IdentityServer to use Entity Framework - appsettings json file

در صورتی که فایل در پروژه وجود نداشته باشد آن را به پروژه اضافه می کنیم. حال به سراغ کلاس startup رفته و ارائه دهنده پیکربندی  json را اضافه می کنیم. این کار به ما این امکان را می دهد که بتوانیم تنظیمات پیکربندی مانند رشته اتصال به دیتابیس (connection string) را بازیابی کنیم. این تکه کد استاندارد معمولا در پروژه های Asp.Net Core یافت می شود.
تکه کد زیر را در ابتدای کلاس startup اضافه می کنیم:

		
public Startup(IHostingEnvironment env)
{
	var builder = new ConfigurationBuilder()
	.SetBasePath(env.ContentRootPath)
	.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
	.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
	.AddEnvironmentVariables();

	Configuration = builder.Build();
}

public IConfigurationRoot Configuration { get; }
حال باید فضای نام Microsoft.Extensions.Configuration را به ابتدای کلاس خود اضافه کنیم. حال به سراغ متد ConfigureServices می رویم. ابتدا باید یک متغیر برای migration assembly تعریف کنیم. و ما می خواهیم این متغیر را به پروژه ای که میزبانی Identity Server را به عهده دارد نسبت دهیم. برای این کار باید از همین کلاس startup استفاده کنیم و سپس متد GetTypeInfo را فراخوانی کنیم، که برای این کار نیاز داریم تا فضای نام  System.Reflection را به ابتدای کلاس اضافه کنیم. سپس نیاز هست تا متد GetName را فراخوانی کنیم تا بتوانیم نام assembly را دریافت نماییم.

var migrationAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;
کار بعدی که باید انجام دهیم، جایگزین کردن پیکربندی های انجام شده برای نگهداری اطلاعات لازم در حافظه،  با متد AddConfigurtionStore است. بنابراین در کد زیرین ، بخش  زیر را حذف می کنیم،

.AddInMemoryIdentityResources(Config.GetIdentityResources())
.AddInMemoryClients(Config.GetClients())
و کد زیر را جایگزین می کنیم.

.AddConfigurationStore(options =>
{
	options.ConfigureDbContext = builder => builder.UseSqlServer(Configuration.GetConnectionString("TokenService"),
	optionsBuilder => optionsBuilder.MigrationsAssembly(migrationAssembly));
})	
این کد این امکان را فراهم می کند تا یک محل ذخیره سازی دائمی برای منابع و داده ها اضافه کنیم. همچنین نیاز داریم تا ارائه دهنده پایگاه داده را نیز مشخص کنیم که در اینجا SQL Server است. همانگونه که در کد فوق می بینید از متد UseSqlServer برای این کار استفاده کردیم. و همچنین ما نیاز داریم تا رشته اتصال به بانک اطلاعاتی را نیز مشخص کنیم. برای استفاده از این کتابخانه نیاز هست تا فضای نام  Microsoft.EntityFrameworkCore را به ابتدای کلاس اضافه کنیم. حال به سراغ ادامه تنظیمات می رویم. برای مشخص کردن متغیر اسمبلی مربوط به مهاجرت از یک نسخه به نسخه بالاتر از همان متغیری استفاده کردیم که بالاتر تعریف کرده بودیم. در ادامه نیاز داریم تا متد AddOperationalStore را فراخوانی کنیم. این کار ما داده های عملیاتی که Identity Server تولید می کند را ذخیره می کند. که شامل اطلاعاتی مانند موارد مربوط به توافق و توکن های مرجع است. درست مانند مشخص کردن تامین کننده بانک اطلاعاتی و رشته اتصال برای متد AddConfigurationStore، برای این متد نیز باید نوع فراهم کننده بانک اطلاعاتی و رشته اتصال را مشخص نماییم. و همچنین مثل متد قبل متغیر اسمبلی مربوط به مهاجرت از یک نسخه به نسخه بالاتر را نیز مشخص کنیم. در نهایت کد زیر را خواهیم داشت:

.AddOperationalStore(options =>
{
options.ConfigureDbContext = builder => builder.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"),
optionsBuilder => optionsBuilder.MigrationsAssembly(migrationAssembly));
})
با این کار ما توانستیم به طور کامل محل ذخیره سازی درون حافظه ای را با محل ذخیره سازی برای اطلاعات پیکر بندی و دیتای عملیاتی با استفاده از  Entity Framework Core جایگزین کنیم .


منبع:

Lynda.com - ASP.NET.Core.Security


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