如何防止Duende Identity Server刷新令牌因密钥不可用失效?
解决Duende Identity Server 6刷新令牌因数据保护密钥问题过早失效的方案
针对你遇到的迁移数据保护存储到数据库后,Power Automate连接的刷新令牌1天内失效的问题,可以通过以下几个步骤解决:
1. 让Identity Server显式复用全局数据保护配置
Duende Identity Server默认会创建独立的数据保护实例,若未绑定到你配置的全局数据保护容器,会导致加密刷新令牌的密钥与数据库存储的密钥环不匹配,进而出现密钥无法找到的情况。需要在Identity Server配置中指定使用全局数据保护提供器:
services.AddIdentityServer() .AddDataProtectionProvider(options => { // 必须与全局AddDataProtection的SetApplicationName值一致 options.ApplicationDiscriminator = Configuration["ApplicationName"]; }) // 后续添加你的Identity Server其他配置(如AddInMemoryClients、AddInMemoryApiResources等)
2. 调整数据保护密钥的生命周期与留存策略
默认的数据保护密钥轮换策略可能过于频繁,导致新生成的密钥快速替换旧密钥,而未过期的刷新令牌仍依赖旧密钥解密,最终触发失效。可以修改配置延长密钥有效期并留存旧密钥:
services.AddDataProtection() .SetApplicationName(Configuration["ApplicationName"]) .PersistKeysToDbContext<DataProtectionKeysContext>() .ProtectKeysWithCertificate(dataProtectionCertificate) .SetDefaultKeyLifetime(TimeSpan.FromDays(180)) // 设置新密钥有效期为180天,按需调整 .SetKeyManagementOptions(options => { options.RetiredKeyLifetime = TimeSpan.FromDays(365); // 旧密钥留存1年,确保过期令牌仍能解密 options.AutoGenerateKeys = true; // 允许自动生成新密钥,但频率由DefaultKeyLifetime控制 });
3. 验证客户端的刷新令牌有效期配置
检查Power Automate对应的Identity Server客户端配置,确认刷新令牌的生命周期参数未被错误设置为1天:
new Client { ClientId = "your-powerautomate-client-id", // 其他客户端配置 RefreshTokenExpiration = TokenExpiration.Sliding, // 滑动过期,按需选择 AbsoluteRefreshTokenLifetime = 2592000, // 绝对有效期30天(单位:秒) SlidingRefreshTokenLifetime = 1296000, // 滑动有效期15天(单位:秒) };
4. 确保数据保护密钥存储的完整性
检查数据库中DataProtectionKeys表的记录,确认所有生成的密钥都已正确持久化,没有出现密钥丢失或被意外清理的情况。若迁移前的Azure Blob存储中还有历史密钥,建议将其导入到数据库表中,避免旧令牌解密失败(针对迁移前已存在的令牌)。
内容的提问来源于stack exchange,提问作者Fraggel
相关产品推荐
相关产品推荐

