.NET Core IdentityServer4实战 第三章-使用EntityFramework Core进行持久化配置

内容:本文带你们使用IdentityServer4进行使用使用EntityFramework Core进行配置和操做数据git

做者:zara(张子浩) 欢迎分享,但需在文章鲜明处留下原文地址。程序员

  前两章内容呢,不管是Client定义仍是Server端对象资源定义都是存储与内存,固然这个问题也被博友问到,那么咱们如何从数据库中读取呢,固然这个IdentityServre已经想好为咱们进行处理了,那么只须要安装 IdentityServer4.EntityFramework  就能够了。github

通常来讲都会使用EF作迁移,那么若是让EF支持.NET Cli命令行呢,打开项目。sql

在 </project> 以前添加一下代码,用于支持Cli命令行,再此以后你能够去项目根目录经过cmd.exe 执行 doenet ef,若是没有出现error,就ok了!若是出现问题大可能是都是这个放错位置了。数据库

  <ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
  </ItemGroup>

鉴于EF的灵活性,咱们本篇文章使用SqlServer数据库,就如今咱们建立一个数据库,还有一些相关的表。app

IdentityServer4.EntityFramework.Storage中的实体维护SqlServer的最新SQL脚本他们就在这里。(随便建立一个数据库,把那两个表放进去执行就好)ide

 下面咱们要在Server进行配置了,须要在 Startup.cs 中的方法 ConfigureServices 进行修改,首先咱们定义了一个常量 connectionString ,这你确定知道,这是一个数据库链接字符串,再往下定义了一个 migrationsAssembly ,它获取了程序集的名称,再经过 AddIdentityServer 以及 AddOperationalStore 方法对数据库的相关迁移配置进行了赋值。ui

const string connectionString = @"Data Source=(LocalDb)\MSSQLLocalDB;database=IdentityServer4.Quickstart.EntityFramework-2.0.0;trusted_connection=yes;";
var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;

// configure identity server with in-memory stores, keys, clients and scopes
services.AddIdentityServer()
    .AddTestUsers(Config.GetUsers())
    // this adds the config data from DB (clients, resources)
    .AddConfigurationStore(options =>
    {
        options.ConfigureDbContext = b =>
            b.UseSqlServer(connectionString,
                sql => sql.MigrationsAssembly(migrationsAssembly));
    })
    // this adds the operational data from DB (codes, tokens, consents)
    .AddOperationalStore(options =>
    {
        options.ConfigureDbContext = b =>
            b.UseSqlServer(connectionString,
                sql => sql.MigrationsAssembly(migrationsAssembly));

        // this enables automatic token cleanup. this is optional.
        options.EnableTokenCleanup = true;
    });

   再此期间你会引用 System.Reflection 以及 Microsoft.EntityFrameworkCore ,如上面所述,上面是硬编码形式进行配置了,更确切的说这些关于数据库的配置都是一个叫作 ConfigurationStoreOptions 的对象,你能够随便修改它,EF兼容的的数据库它都是能够的。由于IdentityServer4实现了EF可实现的接口。this

它从哪里实现了呢?咱们不难发现,在 IdentityServerEntityFrameworkBuilderExtensions 中的定义中有一个叫作 AddOperationalStore 的参数,它就是为了添加动态的存储库,定义以下。编码

public static IIdentityServerBuilder AddOperationalStore<TContext>(this IIdentityServerBuilder builder, Action<OperationalStoreOptions> storeOptionsAction = null) 
        where TContext : DbContext, IPersistedGrantDbContext;

可见它实现了DbContext,而你们都是.NET 程序员,因此我以为你应该知道了怎么回事了,就如今,请确保你的链接字符串正确,咱们要开始进行迁移了!执行如下命令.

dotnet ef migrations add InitialIdentityServerPersistedGrantDbMigration -c PersistedGrantDbContext -o Data/Migrations/IdentityServer/PersistedGrantDb
dotnet ef migrations add InitialIdentityServerConfigurationDbMigration -c ConfigurationDbContext -o Data/Migrations/IdentityServer/ConfigurationDb

 若是没有什么问题,那么结果必定以下所示,固然您的项目中必定要安装 Microsoft.EntityFrameworkCore ,不然将会出现 ERROR:Microsoft.EntityFrameworkCore.Metadata.Internal.DirectConstructorBinding .

 您如今应该在项目中看到一个 〜/Data/Migrations/IdentityServer 文件夹。 这包含新建立的迁移的代码。如今咱们已经添加了迁移,咱们能够编写代码来从迁移中建立数据库。 咱们还将使用咱们在以前的快速入门中定义的内存配置数据对数据库进行种子处理。在Startup.cs中添加这个方法来帮助初始化数据库:

private void InitializeDatabase(IApplicationBuilder app)
        {
            using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
            {
                serviceScope.ServiceProvider.GetRequiredService<PersistedGrantDbContext>().Database.Migrate();
                var context = serviceScope.ServiceProvider.GetRequiredService<ConfigurationDbContext>();
                context.Database.Migrate();
                if (!context.Clients.Any())
                {
                    foreach (var client in Config.GetClients())
                    {
                        context.Clients.Add(client.ToEntity());
                    }
                    context.SaveChanges();
                }
                if (!context.IdentityResources.Any())
                {
                    foreach (var resource in Config.GetIdentityResources())
                    {
                        context.IdentityResources.Add(resource.ToEntity());
                    }
                    context.SaveChanges();
                }
                if (!context.ApiResources.Any())
                {
                    foreach (var resource in Config.GetApis())
                    {
                        context.ApiResources.Add(resource.ToEntity());
                    }
                    context.SaveChanges();
                }
            }
        }

上面的代码可能须要将这些命名空间添加到您的文件中:

using IdentityServer4.EntityFramework.DbContexts;
using IdentityServer4.EntityFramework.Mappers;

而后咱们能够从Configure方法中调用它

public void Configure(IApplicationBuilder app)
{
    InitializeDatabase(app);
}

如今,若是运行IdentityServer项目,则应建立数据库并使用快速入门配置数据进行种子设定。您应该可以使用SQL Server Management Studio或Visual Studio来链接和检查数据。

 

  最后你能够根据这个Client表来配置你的Config.cs中的GetUsers这样服务端的配置也就如此了,固然你能够自定义数据库的字段来适应你的应用程序,那么固然没更新一次你就能够经过EF的相关命令俩更新数据库。那么全部的更新记录就在 __EFMigrationsHistory 表中。 

相关文章
相关标签/搜索