(三)IdentityServer4 结合 Mysql 之初体验
前面写的示例中,IdeneityServer使用的是内存缓存的存储方式,所有的配置都写在Config.cs里。在实际应用中,应该使用数据库存储方式,方便随时配置,如添加新的用户、资源、客户端,也可以节省服务器内存。
本文从三个方面来实现IdentityServer4结合Mysql实现数据库存储方式,分别是客户端及资源数据、令牌及授权码数据以及用户数据。
一、准备内容
mysql 数据库
Nuget 所需包
IdentityServer4.EntityFramework
Pomelo.EntityFrameworkCore.MySql
Microsoft.EntityFrameworkCore.Tools
新建 appsettings.json 文件添加数据库连接字符串
{
"ConnectionStrings": {
"SSOConnection": "server=ipAddress;userid=root;pwd=Password;database=DB;"
}
}二、客户端和资源的数据库存储
前文我们使用的是 AddInMemory 的方式加载配置数据,接下来使用数据库连接方式加载配置数据
1.初始化及构造
public IConfiguration Configuration { get; }
public IHostingEnvironment Environment { get; }
public Startup(IConfiguration configuration, IHostingEnvironment environment)
{
Configuration = configuration;
Environment = environment;
}2.定义数据库连接及获取项目名称
string connectionString = Configuration.GetConnectionString("SSOConnection");
var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name;3.注释 AddInMemory 方式
AddInMemoryIdentityResources(Config.GetIdentityResources()) AddInMemoryApiResources(Config.GetApis()) AddInMemoryClients(Config.GetClients())
4.添加 AddConfigurationStore
.AddConfigurationStore(opt =>
{
opt.ConfigureDbContext = context =>
{
context.UseMySql(connectionString, sql =>
{
sql.MigrationsAssembly(migrationsAssembly);
});
};
})5.配置客户端和资源数据表,把项目设为启动项目,打开程序包管理器控制台,控制台设置默认项目,在控制台执行以下指令添加数据表
add-migration ConfigDbContext -c ConfigurationDbContext -o Data/Migrations/IdentityServer/PersistedGrantDb
6.更新数据库
update-database
7.将 Configs 中的配置数据添加到数据库,在 Start.cs 中执行进行初始化
private void InitializeDatabase(IApplicationBuilder app)
{
using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
{
var context = serviceScope.ServiceProvider.GetRequiredService<ConfigurationDbContext>();
if (!context.Clients.Any())
{
foreach (var client in Configs.GetClients())
{
context.Clients.Add(client.ToEntity());
}
context.SaveChanges();
}
if (!context.IdentityResources.Any())
{
foreach (var resource in Configs.GetIdentityResources())
{
context.IdentityResources.Add(resource.ToEntity());
}
context.SaveChanges();
}
if (!context.ApiResources.Any())
{
foreach (var resource in Configs.GetApis())
{
context.ApiResources.Add(resource.ToEntity());
}
context.SaveChanges();
}
}
}三、令牌和授权码的数据库存储
1.添加 AddOperationalStore
.AddOperationalStore(opt =>
{
opt.ConfigureDbContext = context =>
{
context.UseMySql(connectionString, sql =>
{
sql.MigrationsAssembly(migrationsAssembly);
});
};
opt.EnableTokenCleanup = true;
opt.TokenCleanupInterval = 30;
})2.配置令牌和授权码数据表,把项目设为启动项目,打开程序包管理器控制台,控制台设置默认项目,在控制台执行以下指令添加数据表
add-migration OperationContext -c PersistedGrantDbContext -o Data/Migrations/IdentityServer/OperationDb
3.更新数据库
update-database -c PersistedGrantDbContext