界面 网站,网络服务代码1001,云南网页设计与制作,中山 网站建设开发上几篇#xff0c;我们创建了客户端#xff0c;scope#xff0c;启动时#xff0c;IdentityServer把这些配置数据加载至内存#xff0c;但是#xff0c;如果我们想要更改配置#xff0c;就必须停掉IdentityServer#xff0c;然后重新启动。且IdentityServe在r运行过程中… 上几篇我们创建了客户端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兼容的关系型数据库sqlservermysql。可以在IdentityServer4.EntityFramework.Storage包中找到contextentitiesIdentityServer4 storesIdentityServer4.EntityFramework包括了注册的扩展方法且包括了IdentityServer4.EntityFramework.Storage1.添加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.csusing Microsoft.EntityFrameworkCore;
using System.Reflection; //这里用到了反射var migrationsAssembly typeof(Startup).GetTypeInfo().Assembly.GetName().Name;//3308为宿主机端口映射docker mysql容器默认端口3306
const string connectionString Persist Security InfoFalse;databaseIdentityServer4;serverlocalhost;port3308;Connect Timeout30;user idroot; pwd123456;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 CLIMicrosoft.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.GetServiceIServiceScopeFactory().CreateScope()){serviceScope.ServiceProvider.GetRequiredServicePersistedGrantDbContext().Database.Migrate();var context serviceScope.ServiceProvider.GetRequiredServiceConfigurationDbContext();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
长按二维码关注点外卖先领券