为何依赖方不遵循IdentityServer的IdentityTokenLifetime配置?
问题解答
我把IdentityTokenLifetime设置为60秒的极小值,但60秒后刷新页面仍处于登录状态,未被要求重新输入用户名和密码。我原本以为IdentityTokenLifetime会在id token的payload中生成对应值的"exp"字段,并用于设置用户到依赖方的cookie过期时间,那为什么60秒后cookie没过期,我还能保持登录?
核心误解:IdentityTokenLifetime不控制依赖方会话时长
你混淆了ID Token本身的有效期和依赖方登录会话的有效期,这是两个完全独立的概念:
IdentityTokenLifetime仅负责设置ID Token的exp字段,也就是这个token自身的有效时间。它的作用是让依赖方在接收和验证ID Token时,判断这个token是否还合法——一旦过期,依赖方不能再用这个token来获取用户信息或建立新会话,但不会直接影响已经存在的会话。- 依赖方的登录会话(也就是你看到的保持登录状态的cookie)是由依赖方自己管理的,和ID Token的有效期无关。比如ASP.NET Core的OIDC客户端,在拿到ID Token后会生成本地会话cookie,这个cookie的过期时间默认由客户端自身的配置(比如
CookieAuthenticationOptions.ExpireTimeSpan)决定,或者由授权请求中的max_age参数控制,和ID Token的exp没有直接绑定。
如何让依赖方会话和ID Token同步过期?
如果希望依赖方的登录状态在ID Token过期后立即失效,可以这么做:
- 在客户端发起授权请求时,带上
max_age参数,值设置为和IdentityTokenLifetime一致(比如60)。这样依赖方会在创建会话时,将cookie的过期时间和ID Token的exp对齐,ID Token过期后,会话cookie也会同步失效。 - 直接调整依赖方的会话配置,比如在ASP.NET Core里修改
CookieAuthenticationOptions的ExpireTimeSpan,把它设置为和IdentityTokenLifetime相同的时长。
补充:Refresh Token的作用
如果你的客户端使用了Refresh Token,就算ID Token过期,客户端也可以用有效的Refresh Token向IdentityServer请求新的ID Token,从而维持会话。这种情况下,就算ID Token过期,用户也不会被要求重新登录,除非Refresh Token也过期了。
内容的提问来源于stack exchange,提问作者user25521292
相关产品推荐
相关产品推荐

