I created a customized IConfigurationDbContext
in order to using IDS4 with Oracle.
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);
}
}
in ConfigureService:
services.AddIdentityServer()
.AddTemporarySigningCredential()
.AddAspNetIdentity<ApplicationUser>();
I also have my custom IClientStore
which is added to the container like this:
services.AddScoped<IClientStore, ClientStore>();
when I run IdentityConfigurationDbContext
migration, I get this error:
System.InvalidOperationException: No database provider has been configured for this DbContext.
I tried doing this:
services.AddDbContext<IdentityConfigurationDbContext>(builder => builder.UseOracle(connectionString, options => {
options.MigrationsAssembly(migrationsAssembly);
options.MigrationsHistoryTable("EF_MIGRATION_HISTORY");
}));
Is this the right way to use a custom dbcontext with IDS4? and How do I fix this issue, and complete my migration work?
with the recent release, the Identityserver framework does support custom implementation of configuration store, operation store.
see below for instance
On the services startup
I've tried a different approach. Instead of implementing
IConfigurationDbContext
I have inherited fromIdentityServer4.EntityFramework.DbContexts.ConfigurationDbContext
And in the startup.cs
It works like a charm. Disclaimer: this is not my idea. I just cannot remember the source of that.
Adding an
IDbContextFactory
fixed the issue.You don't need to create a custom
ConfigurationDbContext
or eventIDbContextFactory
in order to switch to use different databases. WithIdentityServer4.EntityFramework
version 2.3.2, you can do:Separate Configuration/Operational Store into its own project/assembly?
What if you want to lay out your solution nicely and would like to separate the configuration store and operational store (as well as the identity user store) into their own class library/assembly?
Per the documentation, you can use
-o
to specify the output migration folder destination:But who likes to memorize/type such long path when doing migrations? Then you might think: how about a custom
ConfigurationDbContext
inherited from IdentityServer's, and a separate project:Common errors
I think this is where people get into troubles. When you do
Add-Migration
, you would either encounter:or
I don't think, for now, there is a way to fix it.
Is there any other ways?
It turns out it's actually quite easy. It seems like you can't have your own
DbContext
inherited from IdentityServer's. So get rid of that, and create an extension method in that separate library/assembly:Then on
Startup.cs
on your web project:And when you do
PM> Add-Migration AddConfigurationTables -Context ConfigurationDbContext
with the default project being that separate library/assembly: