Как читать клиентов и другие конфиги из базы данных в 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);
//...
}
Вы можете прочитать больше в официальной документации. Ссылка на официальную документацию