是否有一种简单的方法来定制IdentityServer4';s配置和操作数据库映射?

是否有一种简单的方法来定制IdentityServer4';s配置和操作数据库映射?,identityserver4,Identityserver4,我正在使用IS4和Oracle数据库实现一个身份验证服务器,以存储配置和操作数据 据我所知,Oracle的表名和列名限制为30个字符。因此,IS4的某些属性在应用数据库迁移时会导致错误,例如: 始终包括所有索赔 FrontChannelLogoutSessionRequired BackChannelLogoutSessionRequired UpdateAccessTokenClaimsOnRefresh 为了覆盖默认数据库映射,我: 1-复制原始ConfigurationDbContex

我正在使用IS4和Oracle数据库实现一个身份验证服务器,以存储配置和操作数据

据我所知,Oracle的表名和列名限制为30个字符。因此,IS4的某些属性在应用数据库迁移时会导致错误,例如:

  • 始终包括所有索赔

  • FrontChannelLogoutSessionRequired

  • BackChannelLogoutSessionRequired

  • UpdateAccessTokenClaimsOnRefresh

为了覆盖默认数据库映射,我:

1-复制原始ConfigurationDbContext:

public class CustomConfigurationDbContext : CustomConfigurationDbContext<CustomConfigurationDbContext>
{
    public CustomConfigurationDbContext(DbContextOptions<CustomConfigurationDbContext> options, ConfigurationStoreOptions storeOptions) : base(options, storeOptions){}
}

public class CustomConfigurationDbContext<TContext> : DbContext, IConfigurationDbContext
    where TContext : DbContext, IConfigurationDbContext
{
    private readonly ConfigurationStoreOptions storeOptions;

    public CustomConfigurationDbContext(DbContextOptions<TContext> options, ConfigurationStoreOptions storeOptions)
        : base(options)
    {
        this.storeOptions = storeOptions ?? throw new ArgumentNullException(nameof(storeOptions));
    }

    public DbSet<Client> Clients { get; set; }
    public DbSet<IdentityResource> IdentityResources { get; set; }
    public DbSet<ApiResource> ApiResources { get; set; }

    public Task<int> SaveChangesAsync()
    {
        return base.SaveChangesAsync();
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            base.OnConfiguring(optionsBuilder);
        }
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.HasDefaultSchema(storeOptions.DefaultSchema);

        modelBuilder.ApplyConfiguration(new ClientEntityTypeConfiguration());
    }

    private class ClientEntityTypeConfiguration : IEntityTypeConfiguration<Client>
    {
        public void Configure(EntityTypeBuilder<Client> builder)
        {
            builder.Property(p => p.AlwaysIncludeUserClaimsInIdToken).HasColumnName("ALWAYS_INC_USR_CLAIM_IN_TKN");

            builder.Property(p => p.FrontChannelLogoutSessionRequired).HasColumnName("FRONT_LOGOUT_SESSION_REQ");

            builder.Property(p => p.BackChannelLogoutSessionRequired).HasColumnName("BACK_LOGOUT_SESSION_REQ");

            builder.Property(p => p.UpdateAccessTokenClaimsOnRefresh).HasColumnName("UP_ACCESS_TKN_CLAIM_ON_REFRESH");
        }
    }
}
公共类CustomConfigurationDbContext:CustomConfigurationDbContext { 公共CustomConfigurationDbContext(DbContextOptions,ConfigurationStoreOptions,storeOptions):基本(选项,storeOptions){} } 公共类CustomConfigurationDbContext:DbContext,IConfigurationDbContext 其中TContext:DbContext,IConfigurationDbContext { 私有只读配置storeOptions storeOptions; 公共CustomConfigurationDbContext(DbContextOptions、ConfigurationStoreOptions和storeOptions) :基本(选项) { this.storeOptions=storeOptions??抛出新的ArgumentNullException(nameof(storeOptions)); } 公共数据库集客户端{get;set;} 公共数据库集标识资源{get;set;} 公共数据库集ApiResources{get;set;} 公共任务saveChangesSync() { 返回base.saveChangesSync(); } 配置时受保护的覆盖无效(DBContextOptions Builder Options Builder) { 如果(!optionBuilder.IsConfigured) { 基本配置(选项生成器); } } 模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder) { 基于模型创建(modelBuilder); HasDefaultSchema(storeOptions.DefaultSchema); ApplyConfiguration(新的ClientEntityTypeConfiguration()); } 私有类ClientEntityTypeConfiguration:IEntityTypeConfiguration { 公共void配置(EntityTypeBuilder) { 建筑商财产(p=>p.AlwaysIncludeUserClaimsInIdToken)。拥有ColumnName(“ALWAYS_INC_USR_CLAIM_IN_TKN”); 属性(p=>p.FrontChannelLogoutSessionRequired).HasColumnName(“前端注销会话请求”); 属性(p=>p.BackChannelLogoutSessionRequired).HasColumnName(“BACK\u LOGOUT\u SESSION\u REQ”); 属性(p=>p.UpdateAccessTokenClaimsOnRefresh).HasColumnName(“UP\u ACCESS\u TKN\u CLAIM\u ON\u REFRESH”); } } } 2-更改了Startup.cs:

var builder = services
    .AddIdentityServer(options =>
    {
        ...
    })
    .AddConfigurationStore<CustomConfigurationDbContext>(options =>
    {
        options.ConfigureDbContext = b =>
            b.UseOracle(Configuration.GetConnectionString("Auth2Connection"), sql =>
                sql.MigrationsAssembly(migrationsAssembly)
                   .MigrationsHistoryTable(Configuration.GetConnectionString("AppMigrationTable"), Configuration.GetConnectionString("AppSchema")));

        options.DefaultSchema = Configuration.GetConnectionString("AppSchema");
    })
var builder=services
.AddIdentityServer(选项=>
{
...
})
.AddConfigurationStore(选项=>
{
options.ConfigureDbContext=b=>
b、 使用Oracle(Configuration.GetConnectionString(“Auth2Connection”),sql=>
sql.MigrationAssembly(MigrationAssembly)
.migrationHistoryTable(Configuration.GetConnectionString(“AppMigrationTable”)、Configuration.GetConnectionString(“AppSchema”);
options.DefaultSchema=Configuration.GetConnectionString(“AppSchema”);
})

它实际上已经起作用了,但我想知道是否有一种官方的或更简单的方法来解决这个问题。

由于没有现成的选项来控制列名映射,因此您使用了正确的方法

只有一个选项可以控制tablename映射:

var builder = services
    .AddIdentityServer(options =>
    {
        ...
    })
    .AddConfigurationStore<CustomConfigurationDbContext>(options =>
    {
        ...    
        options.ApiResource = new TableConfiguration("MyTableName", "MySchemaName");
    })
var builder=services
.AddIdentityServer(选项=>
{
...
})
.AddConfigurationStore(选项=>
{
...    
options.apirource=newtableconfiguration(“MyTableName”、“MySchemaName”);
})

您以正确的方式完成了此操作,因为从那时起,没有现成的选项来控制列名映射

只有一个选项可以控制tablename映射:

var builder = services
    .AddIdentityServer(options =>
    {
        ...
    })
    .AddConfigurationStore<CustomConfigurationDbContext>(options =>
    {
        ...    
        options.ApiResource = new TableConfiguration("MyTableName", "MySchemaName");
    })
var builder=services
.AddIdentityServer(选项=>
{
...
})
.AddConfigurationStore(选项=>
{
...    
options.apirource=newtableconfiguration(“MyTableName”、“MySchemaName”);
})
我不知道这个“options.apirource”配置。它很方便,可能为我节省了很多时间!非常感谢。我不知道这个“options.apirource”配置。它很方便,可能为我节省了很多时间!非常感谢。