Net6.0应用DataProtection服务SQL持久化时频繁报“Error unprotecting key with kid”
问题背景
.NET 6应用已配置DataProtection服务将密钥持久化到SQL数据库,数据库中已生成密钥记录,但每次请求时日志会出现8-9条如下错误,且每条错误对应的kid均不同:
Error unprotecting key with kid TheKid.
异常信息:System.Security.Cryptography.CryptographicException: The key {TheKey} was not found in the key ring.
预期DataProtection使用持久化密钥完成加密解密,密钥按90天周期循环,当前错误大量刷屏,需排查解决。
排查解决方向
验证密钥加载完整性
启动时添加日志输出当前加载的所有密钥kid,和数据库中的密钥记录做对比,确认是否存在密钥未被加载的情况。可能是启动加载逻辑遗漏,或是数据库中存在已过期但未被正确识别的密钥。追踪无效加密数据来源
错误触发于解密环节,说明请求携带了用不存在的密钥加密的数据:- 可能是客户端缓存了旧加密Cookie/数据,对应的密钥已被删除或未同步到当前实例
- 多实例部署场景下,某实例生成的密钥未同步到其他实例,导致跨实例解密失败
可开启详细日志,定位触发错误的请求,查看加密内容对应的kid是否存在于数据库中。
检查密钥生命周期与清理策略
确认DataProtection的密钥生命周期配置是否合理,比如SetDefaultKeyLifetime和SetAutoRefreshInterval参数是否被错误修改,导致密钥提前被清理。如果数据库中不存在错误提示的kid记录,说明该密钥已被清理,但仍有客户端在使用对应加密数据。核对DataProtection核心配置
确认SQL存储的连接字符串权限是否正常,ApplicationName配置是否统一(不同应用名会隔离密钥环)。多实例部署时,所有实例必须使用相同的ApplicationName和SQL存储配置,否则会生成独立密钥环,导致跨实例解密失败。临时日志降噪方案
若暂时无法定位根源,可先调整日志过滤规则降低干扰,后续再解决核心问题:builder.Logging.AddFilter("Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingProvider", LogLevel.Warning);
内容的提问来源于stack exchange,提问作者doogdeb

