IdentityServer4 中文文档 -16- (快速入门)使用 EntityFramework Core 存储配置数据


原文:http://docs.identityserver.io/en/release/quickstarts/8_entity_framework.html

目 录

上一篇:IdentityServer4 中文文档 -15- (快速入门)添加 JavaScript 客户端

IdentityServer 是为可扩展性设计的,其中一个扩展点是其所需数据的存储机制。该快速入门展示了如何配置 IdentityServer 以使用 EntityFramework(EF)作为其数据存储机制(取代目前为止我们一直使用的内存实现)。

IdentityServer4.EntityFramework

我们将移动到数据库的数据有两种,第一种是配置数据(资源 resources 和客户端 client 定义数据)。第二种是 IdentityServer 运行时产生的操作数据。这些存储库都是基于接口建模的,并且我们在 IdentityServer4.EntityFramework NuGet 程序包中为这些接口提供了一套 EF 实现。

我们从添加 IdentityServer4.EntityFramework NuGet 程序包的引用到 IdentityServer 项目中开始(请使用“1.0.1”以上版本的程序包):

添加 SqlServer

鉴于 EF 的灵活性,你现在可以使用任何 EF 支持的数据库。在该快速入门中我们将使用 Visual Studio 自带的 SqlServer LocalDb 版。

为了添加 SqlServer,我们需要多一些 NeGet 程序包。

添加 Microsoft.EntityFrameworkCore.SqlServer 程序包:

添加 Microsoft.EntityFrameworkCore.Tools 程序包:

接下来,我们要添加一些命令行工具(更多细节请点击这里) —— 很不幸,你必须要通过手动编辑 .csproj 文件来实现这些。你可以在 IdentityServer 项目上点击鼠标右键并选择“编辑 QuickstartIdentityServer.csproj”以手动修改 .csproj 文件:

然后添加以下片段到 元素标签之前:

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

其最终看起来是这样的:

保存并关闭该文件。为了验证你已经安装了工具属性,你可以在项目文件目录下打开命令提示符并运行 dotnet ef 命令。运行结果看起来大概是这样的:

配置存储

下一个步骤是替换当前在 Startup.csConfigureServices 方法中调用的 AddInMemoryClientsAddInMemoryIdentityResourcesAddInMemoryApiResources。我们将用以下代码替换它们:

public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(); var connectionString = @"server=(localdb)\mssqllocaldb;database=IdentityServer4.Quickstart.EntityFramework;trusted_connection=yes";
var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name; // 配置使用内存存储用户信息,但使用 EF 存储客户端和资源信息。
services.AddIdentityServer()
.AddTemporarySigningCredential()
.AddTestUsers(Config.GetUsers())
.AddConfigurationStore(builder =>
builder.UseSqlServer(connectionString, options =>
options.MigrationsAssembly(migrationsAssembly)))
.AddOperationalStore(builder =>
builder.UseSqlServer(connectionString, options =>
options.MigrationsAssembly(migrationsAssembly)));
}

上述代码将连接字符串直接硬编码到了代码里面,你可以根据需要进行更改。还有,调用 AddConfigurationStoreAddOperationalStore 其实是为了将 EF 的存储实现注册到系统中。

传递给这些 API 的 “builder” 回调函数是 EF 的机制,这种机制允许你为上述两个存储实现的 DbContext 配置对应的 DbContextOptionsBuilder —— 这涉及到你将如何使用数据库提供程序来装配 DbContext 类型的实例。这里通过调用 UseSqlServer 来使用 SqlServer。你也可以看得出来,这里就是提供数据库连接字符串的地方。

UseSqlServer 方法中的 “options” 回调方法则是用来配置 EF 数据迁移定义所在的程序集的。EF 需要使用数据迁移来为数据库定义相应的架构。

注意:定义这些迁移应该是你的宿主应用程序的职责,因为它们是特定于你的数据库及其提供程序。

我们接下来将添加数据迁移。

添加数据迁移

为了创建迁移,你需要打开命令提示符并定位到 IdentityServer 项目所在的目录,然后运行以下两个命令:

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

运行结果看起来应该是这样的:

初始化数据库

现在我们有了数据迁移,我们可以编写代码来从数据迁移创建数据库了。我们还将使用之前的快速入门中定义的内存配置数据作为种子来初始化数据库。

在 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.GetApiResources())
{
context.ApiResources.Add(resource.ToEntity());
}
context.SaveChanges();
}
}
}

然后在 Configure 方法中调用它:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
// 人为初始化数据库
InitializeDatabase(app); // 其它原有的代码
// ...
}

现在,如果你运行 IdentityServer 项目,应该会创建数据库并使用之前定义的配置数据初始化它。你应该能够使用 SqlServer Management Studio 或 Visual Studio 连接和检查数据:

运行客户端应用程序

现在你应该能够运行所有现有的客户端应用程序并登陆、获取令牌以及调用API了 —— 这些都是基于数据库配置的。

目 录

上一篇:IdentityServer4 中文文档 -15- (快速入门)添加 JavaScript 客户端

IdentityServer4 中文文档 -16- (快速入门)使用 EntityFramework Core 存储配置数据的更多相关文章

  1. IdentityServer4 中文文档 -15- (快速入门)添加 JavaScript 客户端

    IdentityServer4 中文文档 -15- (快速入门)添加 JavaScript 客户端 原文:http://docs.identityserver.io/en/release/quicks ...

  2. IdentityServer4 中文文档 -14- (快速入门)使用 ASP.NET Core Identity

    IdentityServer4 中文文档 -14- (快速入门)使用 ASP.NET Core Identity 原文:http://docs.identityserver.io/en/release ...

  3. IdentityServer4 中文文档 -13- (快速入门)切换到混合流并添加 API 访问

    IdentityServer4 中文文档 -13- (快速入门)切换到混合流并添加 API 访问 原文:http://docs.identityserver.io/en/release/quickst ...

  4. IdentityServer4 中文文档 -12- (快速入门)添加外部认证支持

    IdentityServer4 中文文档 -12- (快速入门)添加外部认证支持 原文:http://docs.identityserver.io/en/release/quickstarts/4_e ...

  5. IdentityServer4 中文文档 -11- (快速入门)添加基于 OpenID Connect 的用户认证

    IdentityServer4 中文文档 -11- (快速入门)添加基于 OpenID Connect 的用户认证 原文:http://docs.identityserver.io/en/releas ...

  6. IdentityServer4 中文文档 -8- (快速入门)设置和概览

    IdentityServer4 中文文档 -8- (快速入门)设置和概览 原文:http://docs.identityserver.io/en/release/quickstarts/0_overv ...

  7. IdentityServer4 中文文档 -9- (快速入门)使用客户端凭证保护API

    IdentityServer4 中文文档 -9- (快速入门)使用客户端凭证保护API 原文:http://docs.identityserver.io/en/release/quickstarts/ ...

  8. IdentityServer4 中文文档 -10- (快速入门)使用密码保护API

    IdentityServer4 中文文档 -10- (快速入门)使用密码保护API 原文:http://docs.identityserver.io/en/release/quickstarts/2_ ...

  9. IdentityServer4 中文文档 -7- (简介)贡献

    IdentityServer4 中文文档 -7- (简介)贡献 原文:http://docs.identityserver.io/en/release/intro/contributing.html ...

随机推荐

  1. ModelAndView返回json对象的方法

    这是在spring4之后. @RequestMapping(value = "/returnjson") public ModelAndView getfsd(){ ModelAn ...

  2. python xss相关的编码解码小脚本

    1.功能分析: 实际工作中经常会遇到alert()之类的函数被防火墙过滤,而把alert()转化为ascii码放到String.fromCharCode()中就可以绕过,之前会一个一个查ascii表, ...

  3. [ 10.08 ]CF每日一题系列—— 602B

    Description: 一个数组,保证相邻两个元素值得差小于1,问题,最大值和最小值的差 < 1的区间长度最长是多少 Solution: 还是卡了一下,本来以为是模拟就好了,但是卡时间,想来想 ...

  4. 1405ST软件测试课的要求补充说明

    期末成绩由考勤.测试小结报告.实验报告.课堂问答.测试总结报告.(暂不安排笔试) 分数分配:考勤10%,测试小结(双周结)报告10%,实验报告30%,课堂问答20%,​测试报告30% 考勤:任选10次 ...

  5. 转:Override vs Overload

    重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也就是说子类 ...

  6. Javascript高级编程学习笔记(78)—— 表单(6)HTML约束验证API

    自动切换焦点 使用JS可以极大地提升表单的易用性 其中最常用的一种就是当用户填写完当前字段后焦点自动切换到下一个字段 以下方的HTML代码为例: <input type="text&q ...

  7. Javascript高级编程学习笔记(47)—— 元素遍历

    元素遍历 为了方便我们使用JS来遍历文档中的元素,W3C在原来的基础之上提出了 Element Traversal 规范 这一规范主要就是为了统一浏览器对文档中节点解析不一致的问题. 比如在某些浏览器 ...

  8. JavaScript 基础排序的实现(一)

    作为一个有追求的前端,忙里偷闲(闲得发慌)地复习了一下基础的排序算法,以此文留念. 本篇主要记录O(n²)复杂度的基础算法O(nlogn)的算法将在下次有空(闲得发慌)时更新 在记录时发现Es6语法中 ...

  9. 4.TableLayout、回调接口

    会话详情页 listview条目布局 列,当第0列的内容过多时,不至于将其他列的内容,挤出屏幕 --> <TableLayout android:id="@+id/tl_rece ...

  10. 电脑知识,一键开启Win10“超级性能模式”

    现在主流系统以及从WIN7慢慢的转移到了WIN10,微软也为WIN10做了很多优化跟更新.今天要跟大家说的这个功能很多人肯定没有听说过.那就是WIN10的超级性能模式. 1. 大多数Win10是没有滴 ...