Я хочу настроить IdentityServer4 для загрузки внешних поставщиков удостоверений из базы данных.Я хотел бы расширить ConfigurationDBContext, чтобы включить DbSet Saml2Provider.В моем стартапе я бы хотел автоматически добавить Saml2Provider.В идеале я хотел бы, чтобы на странице входа в idsvr4 был простой способ обновления списка доступных провайдеров без перезапуска приложения.
Я смог загрузить Saml2Providers из БД и зарегистрировать их каквнешние провайдеры.Однако это использует ApplicationDbcontext, и он не обновляется при каждом запросе к idsvr.
Это мой работающий configureServices (использующий ApplicationDbContext для извлечения поставщиков из БД):
public void ConfigureServices(IServiceCollection services)
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(connectionString));
var builder = services.AddIdentityServer(options =>
{
options.Events.RaiseErrorEvents = true;
options.Events.RaiseInformationEvents = true;
options.Events.RaiseFailureEvents = true;
options.Events.RaiseSuccessEvents = true;
})
// this adds the config data from DB (clients, resources)
.AddConfigurationStore(options =>
{
options.Client.Schema = "config";
options.DefaultSchema = "config";
options.ConfigureDbContext = b =>
b.UseSqlServer(connectionString,
sql => sql.MigrationsAssembly(migrationsAssembly));
})
// this adds the operational data from DB (codes, tokens, consents)
.AddOperationalStore(options =>
{
options.ConfigureDbContext = b =>
b.UseSqlServer(connectionString,
sql => sql.MigrationsAssembly(migrationsAssembly));
// this enables automatic token cleanup. this is optional.
options.EnableTokenCleanup = true;
})
.AddAspNetIdentity<ApplicationUser>()
.AddProfileService<CustomProfileService>();
......
var context = serviceProvider.GetService<ApplicationDbContext>();
var saml2Providers = context.Saml2Providers.ToList();
foreach(var provider in saml2Providers)
{
provider.RegisterService(services);
}
}
Это моя попытка расширить ConfigurationDbContext:
public class IdSrvConfigurationDbContext : ConfigurationDbContext<IdSrvConfigurationDbContext>
{
public DbSet<Saml2Provider> Saml2Providers { get; set; }
public IdSrvConfigurationDbContext(DbContextOptions<IdSrvConfigurationDbContext> options, ConfigurationStoreOptions storeOptions)
:base(options, storeOptions)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//mylogic here
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Saml2Provider>().ToTable("Saml2ProviderConfigContext", schema: "config");
}
}
Я хочу, чтобы внешние поставщики автоматически обновлялись на экране входа в систему при их обновлении в базе данных.Я также хочу загрузить информацию о внешнем провайдере через ConfigurationDbContext, если это возможно, поскольку имеет смысл быть там.
Существует два вопроса, расширяющих ConfigurationDbContext:
Миграции donнеправильно построить:
Невозможно создать объект типа 'IdSrvConfigurationDbContext'.Добавьте реализацию IDesignTimeDbContextFactory в проект или посмотрите https://go.microsoft.com/fwlink/?linkid=851728 для дополнительных шаблонов, поддерживаемых во время разработки.
Я не могу получить доступ к расширенному контекстуот запуска правильно.Я не уверен, как правильно подключить его.
Я уверен, что есть правильный способ подключить его, расширив компоновщик опций Identity, но я понятия не имеюкак это сделатьЛюбая помощь будет принята с благодарностью.