使用Identity Server 4实现SSO时不同客户端Cookie有效期配置问题
核心概念澄清
首先需要明确两类Cookie的职责完全独立,不存在绑定关系:
- IDS4端的
idsrvCookie:统一身份源的全局会话凭证,仅用于判断用户是否已经在身份认证平台完成登录,避免重复输入账号密码 - 各MVC客户端本地的Cookie:客户端自身的会话凭证,有效期、滑动过期规则完全由客户端自主配置,和IDS4的Cookie设置没有强制关联
IDS4的Cookie有效期建议设置为大于等于所有客户端的最大有效时长,你的场景中客户端最长有效期为40分钟,推荐将IDS4的Cookie有效期设置为2小时,可根据整体安全要求选择开启/关闭滑动过期。该配置仅用于保证用户在正常访问业务系统的周期内,跨客户端跳转时无需重复登录,不会影响任何客户端的本地会话规则。
客户端2 10分钟有效期要求的解决方案
你担心的「IDS4 Cookie为40分钟无法满足客户端2的10分钟要求」属于典型的概念混淆,两种常见场景的处理方式如下:
场景1:仅要求客户端2本地会话10分钟滑动过期,允许跳转IDS4时无感知重签
直接在客户端2的认证配置中单独设置本地Cookie规则即可,完全不需要调整IDS4的配置,示例代码如下:
services.AddAuthentication(options => { options.DefaultScheme = "Cookies"; options.DefaultChallengeScheme = "oidc"; }) .AddCookie("Cookies", options => { // 单独配置客户端2的10分钟有效期+滑动过期规则 options.ExpireTimeSpan = TimeSpan.FromMinutes(10); options.SlidingExpiration = true; }) .AddOpenIdConnect("oidc", options => { options.Authority = "你的IDS4服务地址"; options.ClientId = "客户端2的唯一标识"; // 其余OIDC配置(ClientSecret、Scope、回调地址等)省略 });
该场景下,客户端2的Cookie到期后,用户访问时会自动跳转到IDS4,只要IDS4的Cookie还在有效期内,就会直接携带新令牌跳转回客户端2,用户无感知,同时客户端2会生成新的10分钟有效期Cookie,完全符合安全要求。
场景2:要求客户端2用户10分钟无操作后必须重新输入账号密码
如果安全要求更高,不允许无感知重签,需要用户重新验证身份,只需在客户端2的OIDC配置中添加MaxAge参数即可:
.AddOpenIdConnect("oidc", options => { // 其余配置省略 // 要求用户的登录时间距离当前不得超过10分钟,否则强制重新登录 options.MaxAge = TimeSpan.FromMinutes(10); });
该配置会在每次跳转到IDS4时自动带上OIDC标准参数max_age=600,IDS4会自动校验用户的登录时间,即使IDS4本身的Cookie还在有效期内,只要距离上次登录超过10分钟,就会强制弹出登录页要求用户重新输入账号密码,完全满足高安全要求。
补充注意事项
- 不要将IDS4的Cookie有效期设置得短于所有客户端的最长有效期,否则会导致所有业务系统都需要频繁重新登录,影响用户体验
- 多安全等级客户端的差异化会话要求,优先使用OIDC标准的
max_age参数实现,不需要调整IDS4全局配置 - IDS4和各客户端的滑动过期规则可独立配置,互不影响
内容的提问来源于stack exchange,提问作者Donpoulio
相关产品推荐
相关产品推荐

