.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
相关产品推荐
相关产品推荐

