Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

IdentityServer4 Yazı Serisi #23 – IdentityServer4 Entity Framework İle Konfigürasyon Ayarlarını Veritabanına Taşıma

Merhaba,

IdentityServer4 Yazı Serisinin bu sonuncu makalesinde IdentityServer4 ile yaptığımız ve in-memory’de tuttuğumuz tüm client, scope, user vs. gibi konfigürasyonları Entity Framework ile fiziksel veritabanına taşımayı inceliyor olacağız.

Neden konfigürasyon değerlerini fiziksel veritabanında tutmalıyız?
In-memory’de tutulan değerler, olası restart durumlarında sıfırlanırlar. Dolayısıyla run time’da gerçekleştirilen tüm konfigürasyonlar bu şekilde kalıcılık özelliğini yitireceklerinden dolayı fiziksel veritabanlarına kaydedilerek garanti altına alınmalıdırlar.

Ayrıca depolama işlemi in-memory’de yapıldığı sürece sisteme yeni bir client eklendiği zaman sistemin yeniden başlatılması gerekir. Böyle bir durumda client tanımlamalarının fiziksel veritabanından beslenmesi uygulama açısından da daha tercih edilir olacaktır.

Hazır Context’ler

IdentityServer4 veritabanı işlemlerini gerçekleştirebilmek için ConfigurationDbContext ve PersistedGrantDbContext olmak üzere iki farklı context nesnesi sunmaktadır. Bu context’lerin ne olduğunu sırasıyla açıklarsak eğer;

  • ConfigurationDbContext
    Bu context ile; client, scope, user vs. konfigürasyonların hepsini veritabanında tutabiliriz.
  • PersistedGrantDbContext
    Bu context ile ise ConfigurationDbContext’in işlevselliğiyle birlikte token ve authorize code vs. gibi değerleri veritabanında depolayabilmekteyiz.

PersistedGrantDbContext sayesinde uygulama restart edildiğinde üretilen refresh token değeri kaybolmayacak yahut her iki context sayesinde de restart edilmeden sisteme yeni bir client, user vs. ekleyebileceğiz.

Yüklenecek Kütüphaneler

IdentityServer4’te Entity Framework ile işlem yapabilmek için Auth Server uygulamasına IdentityServer4.EntityFramework framework’ünün yüklenmesi gerekmektedir. Ayriyetten SQL Server’a bağlantı sağlayabilmek içinde Microsoft.EntityFrameworkCore.SqlServer kütüphanesinin yüklenmesi gerekmektedir.
IdentityServer4 Yazı Serisi #23 - IdentityServer4 EntityFramework İle Konfigürasyon Ayarlarını Veritabanına Taşıma

Konfigürasyonlar

Startup.cs Konfigürasyonu
Yukarıda tanıtılan context’ler yüklemiş olduğumuz bu IdentityServer4.EntityFramework kütüphanesi içerisinde bulunmaktadır. Dolayısıyla bu paket içerisindeki context’lere erişebilmek ve migration’ları devreye sokabilmek için ‘Startup.cs’ dosyasında aşağıdaki gibi ilgili assembly adı üzerinden konfigürasyon yapmamız gerekmektedir.

    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {

            services.AddIdentityServer()
                .AddConfigurationStore(options =>
                {
                    options.ConfigureDbContext = builder =>
                        builder.UseSqlServer("Server=.;Database=AuthServerDB;Trusted_Connection=True;",
                            sqlOptions => sqlOptions.MigrationsAssembly(typeof(Startup).GetTypeInfo().Assembly.GetName().Name));
                })
                .AddOperationalStore(options =>
                {
                    options.ConfigureDbContext = builder =>
                        builder.UseSqlServer("Server=.;Database=AuthServerDB;Trusted_Connection=True;",
                            sqlOptions => sqlOptions.MigrationsAssembly(typeof(Startup).GetTypeInfo().Assembly.GetName().Name));
                })
                .AddDeveloperSigningCredential();
                .
                .
                .
        }
        .
        .
        .
    }

Yukarıdaki kod bloğunu incelerseniz eğer; 7. satırdaki ‘AddConfigurationStore’ fonksiyonu ile ‘ConfigurationDbContext’in konfigürasyonu, 13. satırdaki ‘AddOperationalStore’ fonksiyonu ile ise ‘PersistedGrantDbContext’ konfigürasyonu yapılmaktadır.

Seed Data Konfigürasyonu
‘Config.cs’ dosyası içerisinde mevcudiyette oluşturmuş olduğumuz konfigürasyonları veritabanına geçirebilmek yahut farklı client, scope vs. gibi varsayılan değerlerle veritabanını ayağa kaldırabilmek için aşağıdaki gibi Seed Data’yı temsil eden bir sınıf oluşturabiliriz.

    public static class SeedData
    {
        public static void Seed(ConfigurationDbContext context)
        {
            if (!context.Clients.Any())
                foreach (var client in Config.GetClients())
                    context.Clients.Add(client.ToEntity());

            if (!context.ApiResources.Any())
                foreach (var apiResource in Config.GetApiResources())
                    context.ApiResources.Add(apiResource.ToEntity());

            if (!context.ApiScopes.Any())
                foreach (var scope in Config.GetApiScopes())
                    context.ApiScopes.Add(scope.ToEntity());

            if (!context.IdentityResources.Any())
                foreach (var identityResource in Config.GetIdentityResources())
                    context.IdentityResources.Add(identityResource.ToEntity());

            context.SaveChanges();
        }
    }

Ardından bu sınıfı aşağıdaki gibi ‘Program.cs’ dosyasında dependency injection ile talep edilen context nesnesi ile kullanabiliriz.

    public class Program
    {
        public static void Main(string[] args)
        {
            var host = CreateHostBuilder(args).Build();
            using var serviceScope = host.Services.CreateScope();
            var services = serviceScope.ServiceProvider;
            var context = services.GetRequiredService<ConfigurationDbContext>();
            SeedData.Seed(context);
            host.Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }

Yukarıdaki kod bloğunu incelerseniz eğer; 5 ile 10. satır arasında IoC container’ında bulunan context nesnesi elde edilmekte ve ilgili seed data bu context üzerinden yüklenmektedir.

Migration Basma ve Veritabanını Oluşturma

IdentityServer4 Yazı Serisi #23 - IdentityServer4 EntityFramework İle Konfigürasyon Ayarlarını Veritabanına Taşıma

Evet… Böylece bundan sonraki tüm süreç veritabanı ile entegre bir şekilde çalışacaktır.

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir