上几篇,我们创建了客户端,scope,启动时,IdentityServer把这些配置数据加载至内存,但是,如果我们想要更改配置,就必须停掉IdentityServer,然后重新启动。且IdentityServe在r运行过程中还会生成临时数据,如授权码、是否同意的按钮选择、以及refresh token。默认情况下,这些也存储在内存中。

将以上这些数据存储在数据库中进行数据持久化,方便重启跨多个IdentityServer实例,这个持久化,我们可以使用IdentityServer4 Entity Framework

除了手动配置EF支持之外,还有一个IdentityServer模板可以使用,dotnet new is4ef创建一个支持EF的新项目。

IdentityServer4.EntityFrameworknuget包实现了所需的存储和服务,主要使用以下两个DbContexts:

  • ConfigurationDbContext - 作用于注册数据,如客户端,资源,scope等等

  • PersistedGrantDbContext - 作用于临时操作数据,如授权码,refresh tokens

这些context适用于任何ef core兼容的关系型数据库,sqlserver,mysql。

可以在

  • IdentityServer4.EntityFramework.Storage包中找到contextentitiesIdentityServer4 stores

  • IdentityServer4.EntityFramework包括了注册的扩展方法,且包括了IdentityServer4.EntityFramework.Storage

1.添加nuget引用

cd .\IdentityServer\
dotnet add package IdentityServer4.EntityFramework

2.添加对mysql的支持

dotnet add package MySql.Data.EntityFrameworkCore

3.数据迁移

IdentityServer4.EntityFramework.Storage包存在包含映射自IdentityServer模型的实体类,随着IdentityServer的模型的更改,IdentityServer4.EntityFramework.Storage中的实体类也将更改,所以需要使用者随着时间的推移,升级使用这个包,这个过程,需要负责在数据库架构以及在实体类更改时,对该数据库架构进行必要的更改。最好的方式就是使用EF数据迁移(EF migrations)

这里官方只提供了针对sqlserver的sql脚本,可以看一下,做个了解。

4.重新配置存储

Startup.cs

using Microsoft.EntityFrameworkCore;
using System.Reflection; //这里用到了反射var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;//3308为宿主机端口,映射docker mysql容器默认端口3306
const string connectionString = @"Persist Security Info=False;database=IdentityServer4;server=localhost;port=3308;Connect Timeout=30;user id=root; pwd=123456";services.AddIdentityServer().AddTestUsers(TestUsers.Users).AddConfigurationStore(options =>{options.ConfigureDbContext = b => b.UseMySQL(connectionString,sql => sql.MigrationsAssembly(migrationsAssembly));}).AddOperationalStore(options =>{options.ConfigureDbContext = b => b.UseMySQL(connectionString,sql => sql.MigrationsAssembly(migrationsAssembly));});

因为我们在IdentityServer.csproj中使用EF迁移,所以通过对MigrationsAssembly的调用来告诉Entity Framework 的宿主项目(IdentityServer.csproj)将包含迁移代码(the migrations code)。这是必要的,因为宿主项目(IdentityServer.csproj)与包含DbContext类的项目,两者是位于不同的程序集中(IdentityServer4.EntityFramework.Storage)。

5.创建迁移

一旦将IdentityServer配置为使用 Entity Framework Core,我们将需要生成一些迁移-migrations。

Entity Framework Core CLI

Microsoft.EntityFrameworkCore.Design nuget包

#安装ef core 工具
dotnet tool install --global dotnet-ef
dotnet add package Microsoft.EntityFrameworkCore.Design#cd到IdentityServer项目目录
dotnet ef migrations add InitialIdentityServerPersistedGrantDbMigration -c PersistedGrantDbContext -o Data/Migrations/IdentityServer/PersistedGrantDbdotnet ef migrations add InitialIdentityServerConfigurationDbMigration -c ConfigurationDbContext -o Data/Migrations/IdentityServer/ConfigurationDb

温故而知新:还记得在VS的Package Manager Console是如何执行命令创建迁移的吗?

#第一步Add-Migration InitialCreate#第二步Update-Database

6.初始化数据库

现在我们已经完成了迁移,我们可以编写代码从迁移-migrations创建数据库。我们还可以使用在前面的quickstart中定义的内存配置数据来为数据库初始化种子,当然这个seed最好只是在调试环境下执行。

官方提示:在这个快速入门中使用的方法主要是使IdentityServer更容易启动和运行。您应该设计适合自己体系结构的数据库创建和维护策略。

在Startup.cs中增加下面的初始化方法:

using System.Linq;
using IdentityServer4.EntityFramework.DbContexts;
using IdentityServer4.EntityFramework.Mappers;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.Clients){context.Clients.Add(client.ToEntity());}context.SaveChanges();}if (!context.IdentityResources.Any()){foreach (var resource in Config.IdentityResources){context.IdentityResources.Add(resource.ToEntity());}context.SaveChanges();}if (!context.ApiResources.Any()){foreach (var resource in Config.Apis){context.ApiResources.Add(resource.ToEntity());}context.SaveChanges();}}
}public void Configure(IApplicationBuilder app)
{// this will do the initial DB populationInitializeDatabase(app);// the rest of the code that was already here// ...
}

上面的InitializeDatabase方法可以方便地 seed the database,但是这种方法在每次运行应用程序时都留进去执行并不理想。一旦填充数据库初始化数据之后,就可以考虑删除对其之调用。

7.运行客户端应用

这个就简略些,上个命令即可

cd src\IdentityServer
dotnet run

长按二维码关注

点外卖,先领券

IdentityServer4(八)使用EntityFramework Core对数据进行持久化相关推荐

  1. EntityFramework Core查询数据基本本质

    [导读]在EntityFramework Core中.当查询出数据后,是如何将数据映射给实体的呢?本节我们预先做个基本探讨,后续给出其底层原理本质 前不久,我们在探索性能时,给出利用反射达到性能瓶颈时 ...

  2. EntityFramework Core解决并发详解

    前言 对过年已经无感,不过还是有很多闲暇时间来学学东西和多陪陪爸妈,这一点是极好的,好了,本节我们来讲讲EntityFramework Core中的并发问题. 话题(EntityFramework C ...

  3. EntityFramework 6.x和EntityFramework Core必须需要MultipleActiveResultSets?

    前言 本节我们来探讨到底需不需要在连接字符串上加上MultipleActiveResultSets = true ?,若您有更深层次的理解欢迎留下您的脚印. EntityFramework 6.x和E ...

  4. ASP.NET Core Identity自定义数据库结构和完全使用Dapper而非EntityFramework Core

    前言 原本本节内容是不存在的,出于有几个人问到了我:我想使用ASP.NET Core Identity,但是我又不想使用默认生成的数据库表,想自定义一套,我想要使用ASP.NE Core Identi ...

  5. EntityFramework Core 1.1有哪些新特性呢?我们需要知道

    前言 在项目中用到EntityFramework Core都是现学现用,及时发现问题及时测试,私下利用休闲时间也会去学习其他未曾遇到过或者用过的特性,本节我们来讲讲在EntityFramework C ...

  6. EntityFramework Core 迁移忽略主外键关系

    [导读]本文来源于一位公众号童鞋私信我的问题,在我稍加思索后给出了如下一种方案,在此之前我也思考过这个问题,借此机会我稍微看了下,目前能够想到的也只是本文所述方案. 为何要忽略主外键关系 我们不仅疑惑 ...

  7. EntityFramework Core表名原理解析,让我来,揭开你神秘的面纱

    上一节我们针对最开始抛出的异常只是进行了浅尝辄止的解析,是不是有点意犹未尽的感觉,是的,我也有这种感觉,看到这里相信您和我会有一些疑惑,要是我们接下来通过注解.Fluent APi.DbSet分别对表 ...

  8. EntityFramework Core动态加载模型,我们要知道些什么呢?

    这篇文章源于一位问我的童鞋:在EntityFramework Core中如何动态加载模型呢?在学习EntityFramwork时关于这个问题已有对应童鞋给出答案,故没有过多研究,虽然最后解决了这位童鞋 ...

  9. EntityFramework Core 2.0执行原始查询如何防止SQL注入?

    前言 接下来一段时间我们来讲讲EntityFramework Core基础,精简的内容,深入浅出,希望为想学习EntityFramework Core的童鞋提供一点帮助. EntityFramewor ...

最新文章

  1. 【微软亚洲研究院MSRA】招聘多模态方向算法实习生
  2. LDAPserver的安装
  3. 干货 | 产品经理要了解的技术类知识
  4. nfs+inotify
  5. chromium关闭更新_Win10今年最重磅更新!Win10 2004正式版详尽体验
  6. Linux系统更新最新版R语言方法
  7. C++ 接口继承与实现继承的区别和选择
  8. bzoj 2560: 串珠子【状压dp】
  9. [android]亲自破解Flappy Bird(去广告+永生)
  10. CentOS7 yum方式安装MySQL5.7
  11. 防热服的设计数学建模_数学建模之高温作业专用服装设计.pdf
  12. QThread如何优雅实现暂停(挂起)功能
  13. 记录从网页下载ppt的过程。
  14. 5G Wifi频段及信道介绍
  15. python计算手机销量年增长率_python如何计算环比增长率
  16. 本地 Git 文件夹显示绿色标识
  17. iOS 9.3.5 越狱
  18. 紫阳的日常——第一章 拒绝访问的高考成绩
  19. 【毕业设计】基于SSM实现酒店管理系统(论文+源码+ppt+视频)
  20. ps制作台式计算机图标,图标制作,用PS制作计算机应用的图标

热门文章

  1. #if defined(__cplusplus)
  2. Java SpringMvc+hibernate架构中,调用Oracle中的sp,传递数组参数
  3. SqlServer和MySQL中存储过程out返回值处理C#代码
  4. 八、结构模式之组合(Composite)模式
  5. Console-算法-递归算法示例
  6. 扩展Windows Mobile模拟器存储空间的方法
  7. [zz]WCF分布式开发步步为赢(0):WCF学习经验分享,如何更好地学习WCF?
  8. linux压缩和解压缩_Linux QuickTip:一步下载和解压缩
  9. 求连续序列的最大子序列和
  10. 9.3磁盘及文件系统管理详解