IdentityServer4(v3.1.x)搭配Entity Framework会话受IIS回收不持久问题
问题根源
ASP.NET Core 默认将DataProtection加密密钥存储在应用进程内存中,当IIS应用池回收、重启或者多实例部署时,原有密钥会丢失,导致之前签发的用户登录Cookie无法被解密,会话直接失效。这就是为什么你的会话时长和IIS应用池回收间隔绑定,和你配置的Cookie有效期、Token有效期均不匹配的核心原因。
你已完成IS4配置数据、运行时数据的数据库持久化,也配置了14天的Cookie有效期,但缺失了DataProtection密钥的持久化配置,因此会话无法跨应用池回收、跨实例保留。
修复步骤
先安装对应版本的NuGet包:
Microsoft.AspNetCore.DataProtection.EntityFrameworkCore
注意版本要和你项目的ASP.NET Core版本、IdentityServer4版本兼容。在
ConfigureServices方法中添加DataProtection持久化配置,替换示例中的IdentityServerDBContext为你项目中实际使用的DbContext即可:
// 持久化DataProtection密钥到数据库 services .AddDataProtection() .PersistKeysToDbContext<IdentityServerDBContext>();
- 生成并执行数据库迁移,将DataProtection密钥存储表同步到数据库:
Add-Migration AddDataProtectionKeys Update-Database
额外注意
如果是多实例部署场景,需要保证所有实例使用相同的签名证书、相同的DataProtection密钥存储,才能实现跨实例会话共享。
内容的提问来源于stack exchange,提问作者Jordy
相关产品推荐
相关产品推荐

