Как читать клиентов и другие конфиги из базы данных в Duende/Identity Server?

У меня вопрос об аутентификации Duende/Identity Sever. Я использую config.cs для хранения клиентов и других конфигураций. Сегодня я перенес их в базу данных Identity server. Теперь я хочу избавиться от Config.cs и читать конфигурации непосредственно из базы данных, но я не знаю, как мне получить доступ к ConfigureDbContext и его объектам. Я предполагаю, что мне следует внести некоторые изменения в program.cs, как показано ниже, но я не мог понять, что я должен использовать вместо этих закомментированных строк ниже.

      builder.Services.AddIdentityServer()
 .AddConfigurationStore(options =>
 {
    options.ConfigureDbContext = b => b.UseSqlServer(connectionString,
        sql => sql.MigrationsAssembly(migrationsAssembly));
})
.AddOperationalStore(options =>
{
    options.ConfigureDbContext = b => b.UseSqlServer(connectionString,
        sql => sql.MigrationsAssembly(migrationsAssembly));
})
//.AddInMemoryIdentityResources(Config.IdentityResources)
//.AddInMemoryApiScopes(Config.ApiScopes)
//.AddInMemoryClients(Config.Clients)
.AddMyUserStore();

Не могли бы вы помочь мне с этим вопросом?

1 ответ

В duende.identity server 6.2 я настроил безAddInMemery()это так: шаг 1 создает новые миграции (потому что они были добавлены новые таблицы и новые поля). скрипт для схемы PersistedGrant:

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

скрипт для схемы конфигурации:

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

Конфигурации indetity сервера:

       builder.Services.AddIdentityServer()
        .AddConfigurationStore(options =>
        {
            options.ConfigureDbContext = b => b.UseSqlite(connectionString,
                sql => sql.MigrationsAssembly(migrationsAssembly));
        })
        .AddOperationalStore(options =>
        {
            options.ConfigureDbContext = b => b.UseSqlite(connectionString,
                sql => sql.MigrationsAssembly(migrationsAssembly));
        })
        .AddTestUsers(TestUsers.Users);

как мы видим без.AddInMemoryIdentityResources(Config.IdentityResources)и.AddInMemoryApiScopes(Config.ApiScopes),.AddInMemoryClients(Config.Clients).

Добавление клиентских конфигураций в нашу базу данных:

      private static 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.Clients)
            {
                context.Clients.Add(client.ToEntity());
            }
            context.SaveChanges();
        }

        if (!context.IdentityResources.Any())
        {
            foreach (var resource in Config.IdentityResources)
            {
                context.IdentityResources.Add(resource.ToEntity());
            }
            context.SaveChanges();
        }

        if (!context.ApiScopes.Any())
        {
            foreach (var resource in Config.ApiScopes)
            {
                context.ApiScopes.Add(resource.ToEntity());
            }
            context.SaveChanges();
        }
    }
}

Вызовите InitializeDatabase из метода ConfigurePipeline:

      public static WebApplication ConfigurePipeline(this WebApplication app)
{ 
    app.UseSerilogRequestLogging();
    if (app.Environment.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    
    InitializeDatabase(app);
    
    //...
}

Вы можете прочитать больше в официальной документации. Ссылка на официальную документацию

Другие вопросы по тегам