.NET Core数据保护密钥从Redis迁移至MySQL Entity Framework的方法
从Redis迁移ASP.NET Core数据保护密钥到MySQL的步骤
1. 导出Redis中的数据保护密钥
数据保护密钥在Redis中通常以DataProtection-Keys:{Id}的格式存储键名,对应的值是密钥的XML内容。
- 用
redis-cli连接Redis服务器,执行命令列出所有数据保护密钥:redis-cli KEYS "DataProtection-Keys:*" - 对每个返回的键,执行
GET命令获取XML内容并保存(建议按Id命名文件):
记录每个文件对应的redis-cli GET "DataProtection-Keys:xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" > key-xxxxxx.xmlId(即键名中DataProtection-Keys:后的部分)。
2. 准备MySQL存储表
在目标MySQL数据库中创建存储密钥的表,结构需覆盖密钥核心信息:
CREATE TABLE DataProtectionKeys ( Id VARCHAR(255) NOT NULL PRIMARY KEY, FriendlyName VARCHAR(255), Xml TEXT NOT NULL, CreateDate DATETIME(6), LastUsedDate DATETIME(6), ExpirationDate DATETIME(6) );
注:
CreateDate、LastUsedDate、ExpirationDate可从密钥XML的<creationDate>、<lastUsedDate>、<expirationDate>节点提取,暂时无法获取可留空。
3. 将密钥导入MySQL
把导出的密钥XML内容批量插入MySQL表:
- 针对每个密钥,执行插入SQL(替换占位符为实际内容):
INSERT INTO DataProtectionKeys (Id, Xml, FriendlyName, CreateDate, LastUsedDate, ExpirationDate) VALUES ( 'xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx', '<key>...</key>', -- 替换为实际密钥XML内容 '', -- 可从XML的<friendlyName>节点提取,无则留空 '2023-01-01 12:00:00.000000', '2023-10-01 12:00:00.000000', '2024-01-01 12:00:00.000000' ); - 插入完成后,查询表确认所有密钥已正确导入。
4. 修改项目配置,切换到MySQL存储
更新ASP.NET Core项目的数据保护配置,替换Redis存储为MySQL存储:
- 安装必要NuGet包:
Install-Package Pomelo.EntityFrameworkCore.MySql Install-Package Microsoft.AspNetCore.DataProtection.EntityFrameworkCore - 创建数据库上下文类:
using Microsoft.AspNetCore.DataProtection.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; public class DataProtectionDbContext : DbContext, IDataProtectionKeyContext { public DataProtectionDbContext(DbContextOptions<DataProtectionDbContext> options) : base(options) { } public DbSet<DataProtectionKey> DataProtectionKeys { get; set; } } - 在
Program.cs中配置数据保护与数据库连接:var builder = WebApplication.CreateBuilder(args); // 配置MySQL数据库上下文 builder.Services.AddDbContext<DataProtectionDbContext>(options => options.UseMySql(builder.Configuration.GetConnectionString("DataProtectionDb"), new MySqlServerVersion(new Version(8, 0, 28)))); // 配置数据保护使用MySQL存储 builder.Services.AddDataProtection() .PersistKeysToDbContext<DataProtectionDbContext>(); // 删除原有的Redis存储配置(如.AddRedis()相关代码) - 更新
appsettings.json中的数据库连接字符串:"ConnectionStrings": { "DataProtectionDb": "server=localhost;database=YourDbName;user=YourUsername;password=YourPassword;" }
5. 验证迁移结果
- 启动项目,确认无密钥加载异常。
- 测试现有加密数据的解密功能,确保MySQL中的密钥能正常解密之前用Redis密钥加密的数据。
- 运行一段时间后,检查MySQL表,确认新生成的密钥会自动写入,且无重复插入问题。
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

