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

上几篇,我们创建了客户端,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

长按二维码关注

点外卖,先领券

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305598.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos 重启网卡_CentOS7网络配置和修改网卡名称及常用服务管理命令

1.设置IP地址和网关及DNSCentOS7里面的网卡名称不在是eth0,1,2而改成enoxxxxxx的格式&#xff0c;en代表的是enthernet以太网&#xff0c;o代表onboard内置&#xff0c;这种新的方式不但长&#xff0c;而且难记&#xff0c;不过优点也比较突出&#xff0c;有编号唯一性&#xf…

android平板 useragent,移动端适配 user-Agent

用navigator结合正则表达式来判断 打开网址的来源function getOrin() {if((navigator..match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobuserAgentile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i))) {/*window.l…

推荐曹济的FPA培训课程

下面是课程的相关内容&#xff0c;供参考&#xff0c;如果有可能&#xff0c;也帮着推荐给别的同事&#xff0c;谢谢&#xff01; 软件功能点估算原理及实践课程说明&#xff1a;http://www.suiji.com.cn/FPA1.htm 功能点应用领域&#xff1a;http://www.suiji.com.cn/FPuse.ht…

C# 中的动态类型

翻译自 Camilo Reyes 2018年10月15日的文章 《Working with the Dynamic Type in C#》 [1] .NET 4 中引入了动态类型。动态对象使您可以处理诸如 JSON 文档之类的结构&#xff0c;这些结构的组成可能要到运行时才能知道。在本文中&#xff0c;Camilo Reyes 解释了如何使用动态…

python根据列表绘制柱状图_python把一个列表画柱状图

原博文 2018-10-18 14:28 − https://blog.csdn.net/w113691/article/details/80385534... 相关推荐 2019-12-07 19:38 − 用python画简单的树 代码如下&#xff1a; import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch, t): time.sleep(0.00…

html 页面工具,html页面工具-htmlUnit

HtmlUnit测试工具的推出&#xff0c;创意非常好。是一款给java开发用的browser。说它是browser&#xff0c;其实它是对html建模并且提供API来访问页面&#xff0c;点击链接等等的java类库。这样的测试工具有这样几个优点&#xff1a;运行起来没有界面&#xff0c;速度非常快。由…

基于电子邮件的InfoPath表单发布的注意点 [Infopath 2007]

让我们先来看看InfoPath 2007提供的其他几种发布方案&#xff1a;1. 将InfoPath模板发布到SharePoint Server或者InfoPath Form Server2. 将InfoPath模板制作成一个安装程序3. 将InfoPath模板发布到一个共享网络地址上方案1,3 都必须依赖已有服务器或网络&#xff0c;而方案2 则…

如何在 C# 8 中使用 Index 和 Range

C# 8 中有几个比较好玩的新特性&#xff0c;比如下面的这两个&#xff1a;System.Index 和 System.Range&#xff0c;分别对应着索引和切片操作&#xff0c;这篇文章将会讨论这两个类的使用。System.Index 和 System.Range 结构体 可以用它们在运行时对集合进行 index 和 slice…

python 廖雪峰数据分析统计服_廖雪峰python教程阅读量统计

统计了下廖老师的python教程各个小节的阅读量&#xff08;毫无卵用&#xff09;&#xff0c;廖老师网站反爬做的比我们教务系统可是好多了&#xff0c;一定时间内访问次数多会禁止&#xff0c;反正数据量也不多&#xff0c;就慢慢来&#xff0c;基本上也不会对网站造成什么影响…

html点击图片弹出大图特效代码,Jquery 点击图片在弹出层显示大图

使用jquery&#xff0c;实现点击图片在弹出层显示大图&#xff0c;再次点击关闭&#xff0c;加入图片高宽和窗口高宽的大小判断。效果图片如下&#xff1a;1.点击前的效果&#xff1a;2.点击后的效果&#xff1a;html代码如下&#xff1a;弹出层图片Js代码如下&#xff1a;$(fu…

使用ClickOnce部署VS2005中的WinForm应用程序.(ZT)

使用ClickOnce部署VS2005中的WinForm应用程序/Files/chinhr/AA.rarTrackBack:http://blog.oracle.com.cn/155011/viewspace_3603.html

Hybrid-APP技术原理

源宝导读&#xff1a;Hybrid-APP技术不仅具有“Native APP的良好交互体验”同时也具备“Web APP跨平台开发的优势”。既然Hybrid-APP有这么多优势&#xff0c;那么究竟什么样的APP才算Hybrid App呢&#xff1f;本文将分享我们的技术研究成果。一、什么是Hybrid-APP狭义的Hybrid…

复旦计算机考研英语,2020考研复旦计算机专硕392经验贴

2020考研复旦计算机专硕392经验贴之前立flag上岸要写经验贴的&#xff0c;谁知今年复试时间跟初试一样长了&#xff0c;想说的都忘了。。但还是写一份吧每个人情况都不同&#xff0c;每个人都有自己的学习节奏&#xff0c;只希望在你焦虑的(我是这样的)看完这些经验贴后&#x…

基于微软ASP.NET AJAX框架开发幻灯片播放网页

一、 简介 最近&#xff0c;微软ASP.NET Ajax 1.0框架以其完整的基于Ajax的web开发方案呈现在web技术人员的前面&#xff0c;凭借与遗留ASP.NET系统的有机整合以及完全面向对象的客户端JavaScript组件模型两大绝杀正在引起越来越多的基于.NET平台的web开发者的关注。本文应该属…

推荐:.Net 5开源免费的内容管理系统

背景介绍内容管理系统&#xff08;content management system&#xff0c;CMS&#xff09;是一种位于WEB 前端&#xff08;Web 服务器&#xff09;和后端办公系统或流程&#xff08;内容创作、编辑&#xff09;之间的软件系统。内容的创作人员、编辑人员、发布人员使用内容管理…

python怎么安装开发版_python - easy_install的安装和使用

为什么要装easy_install? 正常情况下&#xff0c;我们要给Python安装第三方的扩展包&#xff0c;我们必须下载压缩包&#xff0c;解压缩到一个目录&#xff0c;然后命令行或者终端打开这个目录&#xff0c;然后执行 python setup.py install 来进行安装。 这样是不是很繁琐呢&…

河南信息工程学校计算机组装比赛,计算机技术系承办2019全员化试点项目计算机网络装调赛项...

2019年10月16日&#xff0c;由河南省教育厅主办、河南省职业教研室承办的技能竞赛全员化试点项目“计算机网络装调”赛项在河南信息工程学校开赛&#xff0c;来自全省37所学校的96名选手同台竞技&#xff0c;和谐交流。“计算机网络装调”赛项是2019年河南省中职教育技能竞赛的…

常用網址

论坛&#xff1a; [url]www.smth.org[/url] 水木社区bbs.fobshanghai.com 福步论坛英语&#xff1a; [url]http://www.examda.com/syyy/msyy/[/url]   面试英…

限制IIS站点的内存,避免级联影响

背景 代码写的有问题&#xff0c;会很容易出现内存泄露的问题。应用如果是部署在docker容器里面的&#xff0c;可以限制这个应用的内存。那么&#xff0c;如果是传统的.NET Framework应用&#xff0c;部署在IIS上面呢&#xff1f;老黄曾经遇到过在一台服务器上面&#xff0c;II…

笔记本怎么查看hdmi版本_涨知识丨一文看懂笔记本电脑HDMI接口

上一期文章我们同大家简单介绍了笔记本电脑Type-C接口及其日常用途&#xff0c;今天我们来聊聊笔记本电脑上另一个常备的电脑接口HDMI&#xff0c;它究竟是什么&#xff0c;有哪些用途&#xff0c;我们一一为您揭晓&#xff01;如图所示&#xff0c;有着HDMI标识的接口就是我们…