Deprecated: This repository is no longer in active development or maintenance. Use the official library instead: IdentityServer4.EntityFramework.Storage
Entity Framework Core persistence layer for IdentityServer v4
CI Nuget Feed https://ci.appveyor.com/nuget/twentytwenty-identityserver4-e-eghymilgfl2p
The primary key type can be configured for ClientStore and ScopeStore. To facilitate this, when you Register your contexts make sure you use the correct key.
If you have set it up like this you can use EntityFramework Migrations against a single context to build your DB
public class YourDataContext : IClientConfigurationContext<Guid>, IScopeConfigurationContext<Guid>, IOperationalContext
{
public YourDataContext(DbContextOptions<YourDataContext> options)
: base(options)
{ }
public override void OnModelCreating(ModelBuilder modelBuilder)
{
...
modelBuilder.ConfigureClientConfigurationContext<Guid>();
modelBuilder.ConfigureScopeConfigurationContext<Guid>();
modelBuilder.ConfigureOperationalContext();
...
base.OnModelCreating(modelBuilder);
}
}
In the Startup.cs
, register your DbContext with Entity Framework as normal
public void ConfigureServices(IServiceCollection services)
{
...
services.AddEntityFrameworkSqlServer()
.AddDbContext<YourDatabaseContext>(o => o
.UseSqlServer(connectionString, b =>
b.MigrationsAssembly(typeof(Startup).GetTypeInfo().Assembly.GetName().Name)))
...
}
Register your datacontext(s) with the EFCore Contexts
public void ConfigureServices(IServiceCollection services)
{
...
var builder = services.AddIdentityServer(options =>
{
options.RequireSsl = false;
});
builder.ConfigureEntityFramework()
.RegisterOperationalStores<YourDataContext>()
.RegisterClientStore<Guid, YourDataContext>()
.RegisterScopeStore<Guid, YourDataContext>();
...
}
The primary key type can be configured for ClientStore and ScopeStore. To facilitate this, subclass the ClientConfigurationContext<TKey>
and ScopeConfigurationContext<TKey>
with the desired key type.
public class ClientConfigurationContext : ClientConfigurationContext<Guid>
{
public ClientConfigurationContext(DbContextOptions<ClientConfigurationContext> options)
: base(options)
{ }
}
public class ScopeConfigurationContext : ScopeConfigurationContext<Guid>
{
public ScopeConfigurationContext(DbContextOptions<ScopeConfigurationContext> options)
: base(options)
{ }
}
In order to enable extensibility of the OperationalContext
, it must be subclassed. The main reason behind this is EFCore requires the DbContextOptions
constructor to supply a type, which we cannot set to OperationalContext
as it will not allow this class to be extensible.
public class OperationalContextEx : OperationalContext
{
public OperationalContextEx(DbContextOptions<OperationalContextEx> options)
: base(options)
{ }
}
In the Startup.cs
, register your DbContexts with Entity Framework
public void ConfigureServices(IServiceCollection services)
{
...
services.AddEntityFrameworkSqlServer()
.AddDbContext<ClientConfigurationContext>(o => o
.UseSqlServer(connectionString, b =>
b.MigrationsAssembly(typeof(Startup).GetTypeInfo().Assembly.GetName().Name)))
.AddDbContext<ScopeConfigurationContext>(o => o
.UseSqlServer(connectionString, b =>
b.MigrationsAssembly(typeof(Startup).GetTypeInfo().Assembly.GetName().Name)))
.AddDbContext<OperationalContext>(o => o
.UseSqlServer(connectionString, b =>
b.MigrationsAssembly(typeof(Startup).GetTypeInfo().Assembly.GetName().Name)));
...
}
Register the EFCore Contexts
public void ConfigureServices(IServiceCollection services)
{
...
var builder = services.AddIdentityServer(options =>
{
options.RequireSsl = false;
});
builder.ConfigureEntityFramework()
.RegisterOperationalStores()
.RegisterClientStore<Guid, ClientConfigurationContext>()
.RegisterScopeStore<Guid, ScopeConfigurationContext>();
...
}
To get started, sign the Contributor License Agreement.