You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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.xml
    
    记录每个文件对应的Id(即键名中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存储:

  1. 安装必要NuGet包:
    Install-Package Pomelo.EntityFrameworkCore.MySql
    Install-Package Microsoft.AspNetCore.DataProtection.EntityFrameworkCore
    
  2. 创建数据库上下文类:
    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; }
    }
    
  3. 在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()相关代码)
    
  4. 更新appsettings.json中的数据库连接字符串:
    "ConnectionStrings": {
        "DataProtectionDb": "server=localhost;database=YourDbName;user=YourUsername;password=YourPassword;"
    }
    

5. 验证迁移结果

  • 启动项目,确认无密钥加载异常。
  • 测试现有加密数据的解密功能,确保MySQL中的密钥能正常解密之前用Redis密钥加密的数据。
  • 运行一段时间后,检查MySQL表,确认新生成的密钥会自动写入,且无重复插入问题。

内容的提问来源于stack exchange,提问作者Luke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 13:41:40