3

我創建了自定義的IConfigurationDbContext以便將IDS4與Oracle結合使用。使用IdentityServer4進行自定義Configration DBContext

public class IdentityConfigurationDbContext : DbContext, IConfigurationDbContext { 
     private readonly ConfigurationStoreOptions storeOptions; 

     public IdentityConfigurationDbContext(DbContextOptions<IdentityServerDbContext> options) 
     : base(options) { 
    } 

    public IdentityConfigurationDbContext(DbContextOptions<ConfigurationDbContext> 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; } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) { 
     modelBuilder.ConfigureClientContext(storeOptions); 
     modelBuilder.ConfigureResourcesContext(storeOptions); 

     base.OnModelCreating(modelBuilder); 
    } 
    } 

在ConfigureService:

services.AddIdentityServer() 
       .AddTemporarySigningCredential() 
       .AddAspNetIdentity<ApplicationUser>(); 

我也有我的自定義IClientStore被添加到容器是這樣的:

services.AddScoped<IClientStore, ClientStore>(); 

當我運行IdentityConfigurationDbContext遷移,我得到這個錯誤:

System.InvalidOperationException: No database provider has been configured for this DbContext. 

我試着這樣做:

services.AddDbContext<IdentityConfigurationDbContext>(builder => builder.UseOracle(connectionString, options => { 
       options.MigrationsAssembly(migrationsAssembly); 
       options.MigrationsHistoryTable("EF_MIGRATION_HISTORY"); 
      })); 

這是使用具有IDS4定製的DbContext的正確方法?以及如何解決此問題,並完成我的遷移工作?

回答

2

我試過了不同的方法。相反,實施IConfigurationDbContext的我從IdentityServer4.EntityFramework.DbContexts.ConfigurationDbContext

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

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
    { 
     if (!optionsBuilder.IsConfigured) 
     { 
      //... 

      base.OnConfiguring(optionsBuilder); 
     } 
    } 
} 

而在startup.cs

services.AddIdentityServer() 
       .AddTemporarySigningCredential() 
       .AddConfigurationStore(
        builder => builder.UseSqlServer(connectionString, options => options.MigrationsAssembly(migrationsAssembly))) 
       .AddOperationalStore(
        builder => builder.UseSqlServer(connectionString, options => options.MigrationsAssembly(migrationsAssembly))) 
       .AddAspNetIdentity<ApplicationUser>(); 

它的工作原理就像一個魅力繼承。 免責聲明:這不是我的想法。我不記得那個來源。

+0

我這樣做,但在遷移過程中得到這個錯誤:沒有參數的構造函數是在「IdentityConfigurationDbContext」找到。可以在'IdentityConfigurationDbContext'中添加無參數構造函數,或者在與'IdentityConfigurationDbContext'相同的程序集中添加'IDbContextFactory 的實現。 – capiono

+0

即使你繼承** ConfigurationDbContext ** – MJK

+0

是的,我還添加了一個無參數的構造函數相同的東西。 – capiono

0

添加IDbContextFactory修復了此問題。

public class IdentityConfigurationDbContextFactory : IDbContextFactory<IdentityConfigurationDbContext> { 

     public IdentityConfigurationDbContext Create(DbContextFactoryOptions options) { 
      var optionsBuilder = new DbContextOptionsBuilder<ConfigurationDbContext>(); 
      var config = new ConfigurationBuilder() 
          .SetBasePath(options.ContentRootPath) 
          .AddJsonFile("appsettings.json") 
           .AddJsonFile($"appsettings.{options.EnvironmentName}.json", true) 

          .Build(); 

      optionsBuilder.UseOracle(config.GetConnectionString("DefaultConnection")); 

      return new IdentityConfigurationDbContext(optionsBuilder.Options, new ConfigurationStoreOptions()); 
     } 
    } 
+0

是的,你應該有'IDbContextFactory ' – MJK

+0

的實現你是如何在Startup.cs中註冊CustomConfigurationDbContext的?我得到這個錯誤System.InvalidOperationException:'沒有服務類型CustomConfigurationDbContext'已被註冊。' – capiono

+0

檢查我的答案[上面](https://stackoverflow.com/questions/44618235/using-identityserver4-with-custom-configration-dbcontext/44627356#44627356)這是我在啓動時添加的唯一東西 – MJK

0

隨着最近的發佈,Identityserver框架確實支持自定義實現配置存儲,操作存儲。

見下文例如

public class CustomPersistsDbContext : DbContext, IPersistedGrantDbContext 
    { 
    } 

在服務啓動

.AddOperationalStore<CustomPersistsDbContext>(options => 
相關問題