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