升级.NET5及IdentityServer4 V4后参考访问令牌偶发返回JWT问题
问题根因
- 历史持久化授权数据残留:升级前IS3版本或混合流模式下产生的
persisted_grants记录未清理,这些旧记录存储的令牌类型为JWT,且未同步最新的客户端配置。当用户持有的旧身份Cookie未过期时,IS4会直接复用历史授权上下文生成令牌,不会读取当前客户端配置的Reference类型参数,最终返回JWT格式令牌。你当前的临时修复方案可以生效,正是因为清理了旧记录和Cookie强制用户重新走新授权流程。 - IS4 V4版本授权逻辑的适配问题:跨大版本升级后,旧版本存储的授权记录结构与V4不完全兼容,V4默认优先复用历史授权上下文的令牌配置,不会主动拉取最新的客户端
AccessTokenType参数,即便你修改了客户端配置,已存在的授权会话也不会自动更新参数。 - 自定义授权流的逻辑缺失:你配置了自定义的
exchange_reference_token授权类型,如果该自定义流的实现代码没有显式读取当前客户端的AccessTokenType配置,默认会生成JWT类型令牌,触发偶发异常。
彻底修复方案
- 上线前全量清理历史授权数据:新版本上线前,直接清空
persisted_grants表所有记录,同时给主站Cookie增加版本标识,旧版本Cookie直接判定为无效,强制所有用户重新走code + PKCE授权流程,从根源上避免旧数据复用。 - 调整授权逻辑强制读取最新客户端配置:自定义实现
IAuthorizeRequestValidator,在每次授权请求校验阶段,强制覆盖授权上下文的令牌类型为当前客户端配置的AccessTokenType值;针对自定义的exchange_reference_token授权流,在令牌生成逻辑中显式指定令牌类型读取客户端配置,不要使用默认参数。 - 禁用授权记录的永久复用:在IS4服务配置中设置
AllowRememberConsent = false,或者自定义实现IConsentService,每次校验授权同意记录时,对比当前客户端配置的AccessTokenType与历史记录的参数,不一致则自动作废旧记录,触发新授权流程生成符合要求的参考令牌。 - 增加前置校验逻辑:在IS4令牌返回管道中增加校验中间件,当客户端配置为
Reference类型令牌但生成结果为JWT时,自动拦截并重新生成正确的参考令牌,避免异常令牌流出。
内容的提问来源于stack exchange,提问作者DazFahy
相关产品推荐
相关产品推荐

