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

.NET5中不使用Entity Framework实现数据保护密钥存储到数据库

可以不依赖Entity Framework,自定义适配器实现数据保护密钥的数据库存储

ASP.NET Core的数据保护系统具备高度扩展性,你完全可以通过实现**IXmlRepository**接口,替代EF的PersistKeysToDbContext方案,用已有的Insight数据库适配器完成密钥的读写操作。

步骤1:实现IXmlRepository核心接口

这个接口仅需实现两个核心方法,对应密钥的读取与存储逻辑:

  • GetAllElementsAsync:从数据库读取所有密钥的XML结构
  • StoreElementAsync:将新生成的密钥XML写入数据库

结合Insight适配器的示例代码如下:

public class InsightXmlRepository : IXmlRepository
{
    private readonly string _connectionString;

    public InsightXmlRepository(string connectionString)
    {
        _connectionString = connectionString;
    }

    public async Task<IEnumerable<XElement>> GetAllElementsAsync(CancellationToken cancellationToken)
    {
        // 用Insight查询数据库中的密钥记录
        var keyRecords = await DbConnection
            .FromSqlAsync<DataProtectionKeyRecord>(
                _connectionString,
                "SELECT Id, Xml FROM DataProtectionKey",
                cancellationToken: cancellationToken
            )
            .ToListAsync();

        return keyRecords.Select(record => XElement.Parse(record.Xml));
    }

    public async Task StoreElementAsync(XElement element, string friendlyName, CancellationToken cancellationToken)
    {
        var keyId = element.Attribute("id")?.Value ?? Guid.NewGuid().ToString();
        var keyXml = element.ToString(SaveOptions.DisableFormatting);

        var keyRecord = new DataProtectionKeyRecord
        {
            Id = keyId,
            Xml = keyXml,
            CreationDate = DateTime.UtcNow
        };

        // 用Insight执行插入操作
        await DbConnection
            .ExecuteSqlAsync(
                _connectionString,
                "INSERT INTO DataProtectionKey (Id, Xml, CreationDate) VALUES (@Id, @Xml, @CreationDate)",
                parameters: keyRecord,
                cancellationToken: cancellationToken
            );
    }
}

// 匹配数据库表结构的实体类
public class DataProtectionKeyRecord
{
    public string Id { get; set; }
    public string Xml { get; set; }
    public DateTime CreationDate { get; set; }
}

步骤2:注册自定义仓库到依赖注入

在项目的服务配置代码(Startup.cs或Program.cs)中,移除原有的EF相关配置,替换为注册自定义的IXmlRepository:

services.AddDataProtection()
        .SetDefaultKeyLifetime(TimeSpan.FromDays(7))
        .AddXmlRepository(sp => 
        {
            var config = sp.GetRequiredService<IConfiguration>();
            var connStr = config.GetConnectionString("DataConnection");
            return new InsightXmlRepository(connStr);
        });

注意事项

  • 确保数据库中存在DataProtectionKey表,结构至少包含Id(字符串类型主键)、Xml(文本类型,存储密钥XML内容),可按需添加CreationDate等辅助字段。
  • 建议为Id字段添加唯一约束,避免重复密钥存储;如果需要支持密钥更新,可调整插入逻辑为"存在则更新"。
  • 基于Insight的数据库操作需添加必要的错误捕获与重试机制,保证密钥存储的可靠性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 08:15:54