IdentityServer(14)- 使用EntityFramework Core配置和操作数据

IdentityServer具有良好的扩展性,其中一个可扩展点是用于IdentityServer所需数据的存储机制。 本快速入门介绍了如何配置IdentityServer以使用EntityFramework(EF)作为此数据的存储机制(而不是使用我们迄今为止使用的内存中实现)。

IdentityServer4.EntityFramework组件

有两种类型的数据需要持久化到数据库中。 首先是配置数据(资源和客户端),第二个是IdentityServer在使用时产生的操作数据(令牌,代码和同意书)。 这些存储采用接口进行建模,我们在IdentityServer4.EntityFramework Nuget包中提供这些接口的EF实现。

IdentityServer项目通过添加对IdentityServer4.EntityFramework Nuget包的引用开始。

使用SqlServer

鉴于EF的灵活性,您可以使用任何EF支持的数据库。 对于这个快速入门,我们将使用Visual Studio附带的SqlServer的LocalDb版本。

数据库Schema更改和使用EF迁移

IdentityServer4.EntityFramework包包含从IdentityServer的模型映射的实体类。 随着IdentityServer的模型的改变,IdentityServer4.EntityFramework中的实体类也会改变。 当您使用IdentityServer4.EntityFramework并随着时间的推移升级时,您将负责自己的数据库Schema以及实体类更改所需的更改。 管理这些变化的一种方法是使用EF迁移,这个快速入门将显示如何完成。 如果迁移不是您的偏好,那么您可以以任何您认为合适的方式管理架构更改。

为IdentityServer4.EntityFramework中的实体维护SqlServer的SQL脚本。 https://github.com/IdentityServer/IdentityServer4.EntityFramework/tree/dev/src/Host/Migrations/IdentityServer

使用EF工具进行迁移

关于EF迁移可以看我的这篇文章:http://www.cnblogs.com/stulzq/p/7717873.html

我们需要手动更改项目的csproj文件来添加EF工具:

然后在结束</ Project>元素之前添加下面的代码片段:

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

看起来像这样:

保存并关闭文件。 为了测试你已经正确安装了这些工具,你可以在项目所在的目录下打开一个命令shell并运行dotnet ef。 它应该是这样的:

配置store

下一步是在Startup.cs中ConfigureServices方法中的AddInMemoryClients,AddInMemoryIdentityResources和AddInMemoryApiResources进行替换。 我们将用这个代码替换它们:

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()
    .AddDeveloperSigningCredential()
    .AddTestUsers(Config.GetUsers())
    // this adds the config data from DB (clients, resources)
    .AddConfigurationStore(options =>
    {
        options.ConfigureDbContext = builder =>
            builder.UseSqlServer(connectionString,
                sql => sql.MigrationsAssembly(migrationsAssembly));
    })
    // this adds the operational data from DB (codes, tokens, consents)
    .AddOperationalStore(options =>
    {
        options.ConfigureDbContext = builder =>
            builder.UseSqlServer(connectionString,
                sql => sql.MigrationsAssembly(migrationsAssembly));

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

您可能需要将这些命名空间添加到文件中:

using Microsoft.EntityFrameworkCore;
using System.Reflection;

上面的代码是对一个连接字符串进行硬编码,如果你愿意,你可以随意更改。 此外,对AddConfigurationStoreAddOperationalStore的调用是注册EF支持的存储实现。

传递给这些API的“builder”回调方法是EF的机制,允许您为这两个存储中的每一个配置用于DbContextDbContextOptionsBuilder。 这就是我们的DbContext类可以用你想要使用的数据库提供程序来配置。 在这种情况下,通过调用UseSqlServer,我们正在使用SqlServer。 你也可以知道,这是提供连接字符串的地方。

UseSqlServer中的“options”回调函数是配置定义EF迁移的程序集的方法。 EF需要使用迁移来定义数据库的Schema。

添加迁移

要创建迁移,请在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

执行情况应该如下:

您现在应该在项目中看到一个?/ 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.GetApiResources())
            {
                context.ApiResources.Add(resource.ToEntity());
            }
            context.SaveChanges();
        }
    }
}

然后我们可以从Configure方法调用它:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    // this will do the initial DB population
    InitializeDatabase(app);

    // the rest of the code that was already here
    // ...
}

现在,如果运行IdentityServer项目,则应创建数据库并使用快速入门配置数据进行种子插入。 您应该能够使用SQL Server Management Studio或Visual Studio来连接和检查数据。

运行程序

您现在应该能够运行任何现有的客户端应用程序并登录,获取令牌并调用API - 全部基于数据库配置。

本文代码:https://github.com/IdentityServer/IdentityServer4.Samples/tree/release/Quickstarts/8_EntityFrameworkStorage
原文:https://identityserver4.readthedocs.io/en/release/quickstarts/8_entity_framework.html

额外,同时使用ASP.NET Identity和EF的示例请看:https://github.com/IdentityServer/IdentityServer4.Samples/tree/release/Quickstarts/Combined_AspNetIdentity_and_EntityFrameworkStorage

原文地址:https://www.cnblogs.com/stulzq/p/8120518.html

时间: 2024-10-25 18:30:39

IdentityServer(14)- 使用EntityFramework Core配置和操作数据的相关文章

mvc core2.1 IdentityServer.EntityFramework Core 配置

dotnet new mvc -o  IdentityMvc cd IdentityMvc dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore Startup.cs->ConfigureServices using IdentityMvc.Data;using Microsoft.EntityFrameworkCore;using IdentityMvc.Models;using Microsoft.AspNe

第15章 使用EntityFramework Core进行配置和操作数据 I

IdentityServer旨在实现可扩展性,其中一个可扩展点是用于IdentityServer所需数据的存储机制.本快速入门展示了如何配置IdentityServer以使用EntityFramework Core(EF)作为此数据的存储机制(而不是使用我们迄今为止使用的内存中实现). 注意 除了手动配置EF支持外,还有一个IdentityServer模板可用于创建具有EF支持的新项目.使用创建它.有关更多信息,请参见此处dotnet new is4ef 15.1 IdentityServer4

EntityFramework Core解决并发详解

话题(EntityFramework Core并发) 对于并发问题这个话题相信大家并不陌生,当数据量比较大时这个时候我们就需要考虑并发,对于并发涉及到的内容也比较多,在EF Core中我们将并发分为几个小节来陈述,让大家看起来也不太累,也容易接受,我们由浅入深.首先我们看下给出的Blog实体类.     public class Blog : IEntityBase     {        public int Id { get; set; }        public string Nam

从零开始学 ASP.NET Core 与 EntityFramework Core 目录

从零开始学 ASP.NET Core 与 EntityFramework Core 介绍 我是一个目录,它旨在帮助开发者循序渐进的了解 ASP.NET Core 和 Entity Framework Core . 文章会随着版本进行更新,关注我获取最新版本 目标 我们将详细讨论和学习: .NET 平台 ASP.NET Core ASP.NET Core MVC ASP.NET Identity Core Entity Framework Core 适用对象 学习本书的前置条件只需要你有一点 C#

EntityFramework Core 1.1有哪些新特性呢?

前言 在项目中用到EntityFramework Core都是现学现用,及时发现问题及时测试,私下利用休闲时间也会去学习其他未曾遇到过或者用过的特性,本节我们来讲讲在EntityFramework Core 1.1中出现了哪些新特性供我们使用. EntityFramework Core 1.1新特性探讨 DbSet.Find 在EF 6.x中也有此方法的实现,在EF Core 1.1中也同样对此方法进行了实现,为什么要拿出来讲呢,当然也有其道理,我们一起来看看.在         public 

EntityFramework Core Raw Query再叙注意事项后续

前言 话说通过EntityFramwork Core进行原始查询又出问题,且听我娓娓道来. EntityFramework Core Raw Query后续 当我们进行复杂查询时我们会通过原始查询来进行,我们定义如下ViewModel public class BlogViewModel { public int Id { get; set; } public string Name { get; set; } public string Url { get; set; } public str

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

前言 在项目中用到EntityFramework Core都是现学现用,及时发现问题及时测试,私下利用休闲时间也会去学习其他未曾遇到过或者用过的特性,本节我们来讲讲在EntityFramework Core 1.1中出现了哪些新特性供我们使用. EntityFramework Core 1.1新特性探讨 DbSet.Find 在EF 6.x中也有此方法的实现,在EF Core 1.1中也同样对此方法进行了实现,为什么要拿出来讲呢,当然也有其道理,我们一起来看看.在仓储中我们实现Find这个方法,

实现.NET Core配置Provider之EF

<10分钟就能学会.NET Core配置>里详细介绍了.NET Core配置的用法另外我还开源了自定义的配置ProviderEF配置Provider和Yaml配置Provider.本文先来聊聊EF配置Provider的实现其中会涉及到EntityFramework Core的知识不熟悉也没关系且听我慢慢讲来. 配置执行流程 在使用配置的时候都是先new ConfigurationBuilder(),最后调用Build()方法赋值给Configuration属性.那我们就从这个Build方法说起

EntityFramework Core依赖注入上下文方式不同造成内存泄漏了解一下?

前言 这个问题从未遇见过,是一位前辈问我EF Core内存泄漏问题时我才去深入探讨这个问题,刚开始我比较惊讶,居然还有这种问题,然后就有了本文,直接拿前辈的示例代码并稍加修改成就了此文,希望对在自学EF Core过程中的童鞋能有些许帮助. EntityFramework Core内存泄漏回顾 接下来我将用简单示例代码来还原整个造成EntityFramework Core内存泄漏的过程,同时在这个过程中您也可思考一下其中的原因和最终的结果是否一致. public class TestA { pub