You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure AD SAML认证返回过期令牌,如何实现无缝登录?

解决Spring Security SAML对接Azure AD的无缝登录问题

问题根源分析

默认配置下Azure AD返回的SAML断言notOnOrAfter过期,通常源于以下几点:

  • Azure AD企业应用的断言有效期配置错误
  • 应用服务器与Azure AD的时钟未同步
  • SAML请求参数配置冲突(forceAuthN与passive参数混用或设置错误)

解决方案

1. 修正Azure AD企业应用的SAML配置

  • 登录Azure门户,找到目标企业应用,进入单一登录 -> 用户属性与声明
    • 检查是否存在自定义的notOnOrAfter声明,确保其设置了合理有效期(例如1小时),避免被配置为过去的时间
  • 进入单一登录 -> 会话生存期
    • 设置合适的应用会话超时和SSO会话超时,保证Azure AD会为有效会话返回未过期的SAML断言

2. 调整Spring Security SAML配置以复用SSO会话

  • 同步服务器时钟:确保应用服务器通过NTP服务与UTC时间同步,避免因时间差导致断言被误判为过期
  • 设置时钟偏差容忍度:在SAML断言验证逻辑中配置maxClockSkew,允许微小的时间偏差(例如5分钟)
  • 启用被动认证:移除forceAuthN=true,改为设置isPassive=true,让Azure AD尝试复用已有用户会话,无需重新输入密码(注意forceAuthN与isPassive不能同时设为true)

Java配置示例

@Bean
public AuthenticationRequest samlAuthenticationRequest() {
    return AuthenticationRequest.builder()
        .passive(true) // 启用被动认证,复用已有会话
        .maxClockSkew(300) // 允许5分钟的时钟偏差
        .build();
}

XML配置示例

<bean id="samlAuthenticationRequest" class="org.springframework.security.saml.saml2.authentication.AuthenticationRequest">
    <property name="passive" value="true"/>
    <property name="maxClockSkew" value="300"/>
</bean>

3. 验证Azure AD用户会话状态

确认用户未主动登出Azure AD全局会话,若用户已登出所有Azure应用,自然需要重新登录;其他应用能无缝登录通常是因为它们在Azure AD的SSO会话有效期内发起了认证请求。

总结

通过调整Azure AD企业应用的断言与会话配置,修正Spring Security SAML的请求参数和时钟偏差设置,即可实现与其他Azure AD认证应用一致的无缝登录体验,无需强制用户每次输入密码。

内容的提问来源于stack exchange,提问作者Aleks G

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 08:10:12