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

内容:本文带大家使用IdentityServer4进行使用使用EntityFramework Core进行配置和操作数据
作者:zara(张子浩) 欢迎分享,但需在文章鲜明处留下原文地址。
前两章内容呢,无论是Client定义还是Server端对象资源定义都是存储与内存,当然这个问题也被博友问到,那么我们如何从数据库中读取呢,当然这个IdentityServre已经想好为我们进行处理了,那么只需要安装 IdentityServer4.EntityFramework 就可以了。

一般来说都会使用EF做迁移,那么如果让EF支持.NET Cli命令行呢,打开项目。

在 </project> 之前添加一下代码,用于支持Cli命令行,再此之后你可以去项目根目录通过cmd.exe 执行 doenet ef,如果没有出现error,就ok了!如果出现问题大多是都是这个放错位置了。
<ItemGroup>
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.0" />
</ItemGroup>
鉴于EF的灵活性,我们本篇文章使用SqlServer数据库,就现在我们创建一个数据库,还有一些相关的表。
为IdentityServer4.EntityFramework.Storage中的实体维护SqlServer的最新SQL脚本。他们就在这里。(随便创建一个数据库,把那两个表放进去执行就好)
下面我们要在Server进行配置了,需要在 Startup.cs 中的方法 ConfigureServices 进行修改,首先我们定义了一个常量 connectionString ,这你肯定知道,这是一个数据库连接字符串,再往下定义了一个 migrationsAssembly ,它获取了程序集的名称,再通过 AddIdentityServer 以及 AddOperationalStore 方法对数据库的相关迁移配置进行了赋值。
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可实现的接口。
它从哪里实现了呢?我们不难发现,在 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 表中。
.NET Core IdentityServer4实战 第三章-使用EntityFramework Core进行持久化配置的更多相关文章
- .NET Core IdentityServer4实战 第六章-Consent授权页
在identityServer4中登陆页面只要是成功了,就会注册一个Cookie在服务器资源上,像现在大部分的网站第三方授权,都是经过一个页面,然后选需要的功能,IdentityServer4也给我们 ...
- .NET Core IdentityServer4实战-开篇介绍与规划
一.开篇寄语 由于假期的无聊,我决定了一个非常有挑战性的活动,也就是在年假给大家带来一个基于OAuth 2.0的身份授权框架,它就是 IdentityServer4 ,如果没有意外的话,一定可以顺利的 ...
- 《驾驭Core Data》 第三章 数据建模
本文由海水的味道编译整理,请勿转载,请勿用于商业用途. 当前版本号:0.1.2 第三章数据建模 Core Data栈配置好之后,接下来的工作就是设计对象图,在Core Data框架中,对象图被表 ...
- Rxjava2实战--第三章 创建操作符
Rxjava2实战--第三章 创建操作符 Rxjava的创建操作符 操作符 用途 just() 将一个或多个对象转换成发射这个或者这些对象的一个Observable from() 将一个Iterabl ...
- 【无私分享:ASP.NET CORE 项目实战(第二章)】添加EF上下文对象,添加接口、实现类以及无处不在的依赖注入(DI)
目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 上一章,我们介绍了安装和新建控制器.视图,这一章我们来创建个数据模型,并且添加接口和实现类. 添加EF上下文对象 按照我们以前 ...
- Pro ASP.NET Core MVC 6th 第三章
第三章 MVC 模式,项目和约定 在深入了解ASP.NET Core MVC的细节之前,我想确保您熟悉MVC设计模式背后的思路以及将其转换为ASP.NET Core MVC项目的方式. 您可能已经了解 ...
- 【无私分享:ASP.NET CORE 项目实战(第九章)】创建区域Areas,添加TagHelper
目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 在Asp.net Core VS2015中,我们发现还有很多不太简便的地方,比如右击添加视图,转到试图页等功能图不见了,虽然我 ...
- [转]【无私分享:ASP.NET CORE 项目实战(第九章)】创建区域Areas,添加TagHelper
本文转自:http://www.cnblogs.com/zhangxiaolei521/p/5808417.html 目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 在Asp ...
- 第15章 使用EntityFramework Core进行配置和操作数据 - Identity Server 4 中文文档(v1.0.0)
IdentityServer旨在实现可扩展性,其中一个可扩展点是用于IdentityServer所需数据的存储机制.本快速入门展示了如何配置IdentityServer以使用EntityFramewo ...
随机推荐
- [Java算法分析与设计]--顺序栈的实现
在程序的世界,栈的应用是相当广泛的.其后进先出的特性,我们可以应用到诸如计算.遍历.代码格式校对等各个方面.但是你知道栈的底层是怎么实现的吗?现在跟随本篇文章我们来一睹它的庐山真面目吧. 首先我们先定 ...
- GenyMotion 配合 Android Studio 的安装
众所周知,Android Studio 自带的模拟器对内存和CPU消耗都很大却并没有很好的效果,简直是谷歌为了卖手机设计的.而Geny Motion 对机能的要求大大降低,又不会像自带模拟器那么卡.G ...
- C#学习(一):委托和事件
预备知识 在学习委托和事件之前,我们需要知道的是,很多程序都有一个共同的需求,即当一个特定的程序事件发生时,程序的其他部分可以得到该事件已经发生的通知. 而发布者/订阅者模式可以满足这种需求.简单来说 ...
- C/C++ 数据结构之算法
数据结构中的排序算法. 排序算法的相关知识: (1)排序的概念:所谓排序就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来. (2)稳定的排序方法:在待排序的文件中,若存在多个关键字相同的 ...
- linux下c编程 基础
1. 熟悉Linux系统下的开发环境 2. 熟悉vi的基本操作 3. 熟悉gcc编译器的基本原理 4. 熟练使用gcc编译器的常用选项 5 .熟练使用gdb调试技术 6. 熟悉makefile基本原理 ...
- Jmeter 测试工具
Jmeter的基本概念 百度百科: Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域. 它可 ...
- spring-boot-oracle spring-batch
Install/Configure Oracle express Oracle xe installer for linux (I don't care if you're running linux ...
- nginx php 配置跨域
我使用的是lnmp一键安装包 在虚拟记住添加 add_header 'Access-Control-Allow-Origin' '*'; add_header 'Access-Control-Allo ...
- Asp.net MVC + Redis(hash入库+log4net集成)
博客四元素 既然要写一个博客类的网站,那就应该知道博客的相关信息. 标题 作者 时间 内容 title author time content 因为之前有了解过Redis,所以有点纠结于数据的存储方式 ...
- 如何编写高质量JavaScript代码
书写可维护的代码(Writing Maintainable Code ) 软件bug的修复是昂贵的,并且随着时间的推移,这些bug的成本也会增加,尤其当这些bug潜伏并慢慢出现在已经发布的软件中时.当 ...