基于IdentityServer4的服务30分钟超时,SSO仅前30分钟可用问题咨询
嘿,我之前也踩过类似的SSO超时坑,结合IdentityServer4和.NET Core 2.0的特性,给你梳理几个最可能的原因和解决办法:
1. 调整IdentityServer4的会话核心配置
idsrv.session cookie默认就是30分钟超时,这大概率是问题根源。你需要在Startup.cs里修改会话过期设置:
在ConfigureServices方法中,找到AddIdentityServer的配置块,添加会话相关配置:
services.AddIdentityServer() .AddDeveloperSigningCredential() // 其他已有的配置(比如添加资源、客户端)... .AddServerSideSessionCache() .ConfigureSession(options => { options.IdleTimeout = TimeSpan.FromHours(8); // 改成你需要的时长,比如8小时 options.Cookie.HttpOnly = true; options.Cookie.IsEssential = true; });
同时要确保在Configure方法里,会话中间件放在IdentityServer之前启用:
app.UseSession(); app.UseIdentityServer();
2. 修改AspNetCore Identity的Cookie过期规则
AspNetCore.Identity.Application cookie也会限制登录有效期,在Identity配置里调整:
services.ConfigureApplicationCookie(options => { options.ExpireTimeSpan = TimeSpan.FromHours(8); options.SlidingExpiration = true; // 开启滑动过期,用户有操作就自动延长有效期 });
这里的SlidingExpiration很关键,能避免用户正常操作时被强制登出。
3. 同步客户端应用的Cookie与Token配置
别忘了每个SSO客户端也要对应调整,不然客户端自身的Cookie超时会导致SSO失效:
在客户端的Startup.cs里,修改OpenID Connect和Cookie的配置:
services.AddAuthentication(options => { options.DefaultScheme = "Cookies"; options.DefaultChallengeScheme = "oidc"; }) .AddCookie("Cookies", options => { options.ExpireTimeSpan = TimeSpan.FromHours(8); options.SlidingExpiration = true; }) .AddOpenIdConnect("oidc", options => { options.Authority = "https://your-identity-server-url"; options.ClientId = "your-client-id"; options.ClientSecret = "your-client-secret"; options.ResponseType = "code id_token"; options.SaveTokens = true; options.UseTokenLifetime = false; // 若想独立控制客户端Cookie时长,设为false });
4. 检查分布式会话存储(多实例部署场景)
如果你的IdentityServer是多实例部署,一定要用分布式会话存储(比如Redis、SQL Server),不然每个实例的会话独立,用户切换实例时会触发超时。在.NET Core 2.0里配置分布式缓存:
services.AddDistributedRedisCache(options => { options.Configuration = "your-redis-connection-string"; options.InstanceName = "IdentityServer"; }); services.AddSession(options => { // 这里放之前的会话超时配置 });
5. 验证Cookie实际过期时间
可以打开浏览器开发者工具,查看idsrv.session和AspNetCore.Identity.Application的过期时间,确认配置是否生效。如果还是显示30分钟,检查Startup.cs里的中间件顺序是否正确,比如会话中间件有没有放在IdentityServer之前。
最后提个小建议:.NET Core 2.0已经是比较老旧的版本了,虽然上述方法能解决问题,但如果有条件,升级到.NET Core 3.1或更高版本会更安全,也能避免一些旧版本的已知bug。
内容的提问来源于stack exchange,提问作者John Cheng

