You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于IdentityServer4的服务30分钟超时,SSO仅前30分钟可用问题咨询

解决IdentityServer4 + .NET Core 2.0 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:38:24