Duende.IdentityServer 7.0.8:如何延长客户端用户Cookie有效期?
核心问题分析
你之前尝试的两个方案都没命中关键点:
ConfigureExternalCookie:仅用于IDP处理第三方外部登录的Cookie,和客户端自身的认证Cookie完全无关,所以无效。- 全局
CookieLifetime:会覆盖IDP所有场景的Cookie配置,包括IDP自身的登录Cookie,必然导致全局混乱。
客户端的认证Cookie存储在客户端主机域名下,完全由客户端项目的认证中间件配置控制,和IDP的全局配置无关。
正确配置步骤(客户端项目中操作)
在客户端的Program.cs里,针对OIDC认证对应的Cookie Scheme进行配置:
- 配置Cookie认证中间件的有效期
明确指定Cookie的过期时间,并根据业务需求开启滑动过期:
builder.Services.AddAuthentication(options => { options.DefaultScheme = "Cookies"; options.DefaultChallengeScheme = "oidc"; }) .AddCookie("Cookies", options => { // 设置Cookie有效期,示例为7天 options.ExpireTimeSpan = TimeSpan.FromDays(7); // 开启滑动过期:用户活动时自动刷新Cookie有效期 options.SlidingExpiration = true; // 可选:设置Cookie过期后的登录跳转路径 options.LoginPath = "/login"; }) .AddOpenIdConnect("oidc", options => { options.Authority = "https://你的IDP域名"; options.ClientId = "你的客户端ID"; options.ClientSecret = "你的客户端密钥"; options.ResponseType = "code"; options.SaveTokens = true; // 必须开启,保存refresh token用于自动刷新 options.Scope.Add("openid"); options.Scope.Add("profile"); // 关闭使用IDP token的生命周期,改用客户端Cookie的配置 options.UseTokenLifetime = false; options.TokenValidationParameters = new TokenValidationParameters { NameClaimType = "name", RoleClaimType = "role" }; });
- 匹配IDP端的客户端配置
确保IDP后台配置的该客户端Token有效期足够支撑客户端Cookie的有效期:
- 在IDP的
Client实体配置中,设置AccessTokenLifetime(示例设为86400秒=1天) - 设置
RefreshTokenLifetime(示例设为604800秒=7天),确保客户端可以用refresh token持续刷新access token,避免Cookie未过期但token失效导致的登录中断。
关键注意事项
- 客户端Cookie的有效期不要超过IDP颁发的refresh token有效期,否则refresh token过期后,客户端无法自动刷新,用户会被强制重新登录。
- 若不需要滑动过期,将
SlidingExpiration设为false,Cookie会严格按固定时间过期。
内容的提问来源于stack exchange,提问作者Farzad M.
相关产品推荐
相关产品推荐

