Spring Authorization Server中ID Token缺失SID声明的解决问询
问题原因
SID(Session ID)是标识用户会话的关键声明,用于登出流程定位会话。用户名密码登录流程默认未自动注入该声明,而超级管理员代登、Azure AD登录等场景因依赖外部认证或特定会话处理逻辑,自动包含了SID。
解决方案
1. 自定义JWT Token定制器
创建类实现OAuth2TokenCustomizer<JwtEncodingContext>,在ID Token生成时手动添加SID声明:
import org.springframework.security.oauth2.server.authorization.token.JwtEncodingContext; import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenCustomizer; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; @Component public class SidTokenCustomizer implements OAuth2TokenCustomizer<JwtEncodingContext> { @Override public void customize(JwtEncodingContext context) { // 仅对ID Token添加SID声明 if ("id_token".equals(context.getTokenType().getValue())) { HttpServletRequest request = context.getHttpRequest().get(); String sessionId = request.getSession().getId(); context.getClaims().claim("sid", sessionId); } } }
2. 注册定制器到授权服务器配置
在授权服务器配置类中,将自定义的Token定制器绑定到JWT编码器:
import org.springframework.context.annotation.Bean; import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration; import org.springframework.security.oauth2.server.authorization.config.annotation.web.configurers.OAuth2AuthorizationServerConfigurer; import org.springframework.security.oauth2.server.authorization.token.JwtEncoder; @Configuration public class AuthorizationServerConfig { private final SidTokenCustomizer sidTokenCustomizer; public AuthorizationServerConfig(SidTokenCustomizer sidTokenCustomizer) { this.sidTokenCustomizer = sidTokenCustomizer; } @Bean public OAuth2AuthorizationServerConfigurer authorizationServerConfigurer() { return new OAuth2AuthorizationServerConfigurer() .token(tokenConfig -> tokenConfig .jwt(jwtConfig -> jwtConfig .encoder(jwtEncoder()) .customizer(sidTokenCustomizer))); } // 实现你的JWT编码器,例如基于Nimbus的实现 @Bean public JwtEncoder jwtEncoder() { // 此处替换为你的JwtEncoder具体实现逻辑 // 示例:return new NimbusJwtEncoder(jwkSource); } }
3. 验证配置有效性
完成配置后,使用用户名密码登录获取ID Token,解析后确认sid声明已存在。此时即可基于该SID触发正常的登出流程。
内容的提问来源于stack exchange,提问作者user7090887
相关产品推荐
相关产品推荐

