Я внедряю сервер аутентификации, использующий IS4, с базой данных Oracle для хранения конфигурационных и рабочих данных.
Насколько я знаю, Oracle имеет ограничение в 30 символов для имен таблиц и столбцов.По этой причине некоторые свойства IS4 вызывают ошибки при применении миграций базы данных, например:
AlwaysIncludeUserClaimsInIdToken
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");
}
}
}
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");
})
Это действительно сработало, но мне интересно, есть ли официальныйили более простой способ решить эту проблему.