Identity Server4 客户端会话超时配置后静默重认证、SSO失效问题咨询
问题根源
你遇到的现象本质是混淆了两套独立的身份会话体系:
- 客户端本地Cookie会话:你通过
AddCookie配置的是当前站点的登录态有效期,会话过期后会自动触发到Identity Server(IDS)的认证重定向 - IDS端SSO会话:用户首次登录IDS后,浏览器会在IDS域名下留存SSO会话Cookie,只要该Cookie未过期,不带特殊参数的OIDC认证请求会直接拿到有效身份凭证,无需用户再次输入账号密码,也就是你遇到的「静默重登」现象
你后续全局配置options.Prompt = "login"的操作,相当于强制所有OIDC认证请求都要求用户重新登录,自然会导致跨站点的SSO能力完全失效,该配置不应该全局生效。
正确实现方案
第一步:修正Cookie配置实现无操作计时
你之前将SlidingExpiration设为false,代表Cookie是绝对有效期,无论用户是否有操作,登录后满5分钟就会过期,不符合「无操作满5分钟过期」的需求,需要调整为开启滑动过期:
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options => { options.ExpireTimeSpan = TimeSpan.FromMinutes(5); options.SlidingExpiration = true; // 用户每次活跃操作会自动刷新Cookie过期时间 })
第二步:按需添加强制登录参数
删除OIDC配置里全局的options.Prompt = "login",通过OIDC事件拦截重定向请求,仅在客户端本地会话过期触发的重认证场景下添加强制登录参数,其他正常登录场景保留SSO能力:
.AddOpenIdConnect("oidc", options => { // 保留你的其他原有配置 options.Events = new OpenIdConnectEvents { OnRedirectToIdentityProvider = context => { // 判断当前重定向为本地会话过期触发的重认证 if (context.HttpContext.User.Identity?.IsAuthenticated == false && !string.IsNullOrEmpty(context.Properties.RedirectUri)) { context.ProtocolMessage.Prompt = "login"; } return Task.CompletedTask; } }; })
可选优化
如果需要更严格的会话管控,可以同步在Identity Server端配置SSO会话的最大有效期,避免用户只要不关闭浏览器就能长期通过静默认证恢复登录态,可根据业务需求调整。
内容的提问来源于stack exchange,提问作者cereales
相关产品推荐
相关产品推荐

