我正在寻找自定义 IdentityServer4 以从数据库加载外部身份提供程序。我想扩展 ConfigurationDBContext 以包含 Saml2Provider 的 DbSet。在我的启动中,我想自动添加 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 有 2 个问题:
迁移未正确构建:
无法创建“IdSrvConfigurationDbContext”类型的对象。将“IDesignTimeDbContextFactory”的实现添加到项目中,或查看https://go.microsoft.com/fwlink/?linkid=851728了解设计时支持的其他模式。
我无法从启动中正确访问扩展上下文。我不确定如何正确接线。
我确信通过扩展身份选项构建器可以正确地连接它,但我不知道如何做到这一点。任何帮助将不胜感激。