Есть ли простой способ настроить конфигурацию IdentityServer4 и оперативное отображение базы данных? - PullRequest
0 голосов
/ 11 мая 2019

Я внедряю сервер аутентификации, использующий 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");
    })

Это действительно сработало, но мне интересно, есть ли официальныйили более простой способ решить эту проблему.

1 Ответ

0 голосов
/ 12 мая 2019

Вы сделали это правильно, так как нет встроенной опции для управления отображением имени столбца, так как это жестко закодировано .

Существует только опция для управления отображением имени таблицы:

var builder = services
    .AddIdentityServer(options =>
    {
        ...
    })
    .AddConfigurationStore<CustomConfigurationDbContext>(options =>
    {
        ...    
        options.ApiResource = new TableConfiguration("MyTableName", "MySchemaName");
    })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...