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

Azure部署的企业Microsoft账号登录Web应用30分钟闲置会话超时问题

企业Microsoft账号登录的Azure Web应用会话超时配置方案

能否仅通过Azure门户配置会话超时?

不能。Azure应用服务门户的「配置>常规设置」中的会话超时,仅针对Azure托管的会话存储(如Redis、文件系统),无法覆盖Spring Boot自身的Servlet会话管理配置。此外,由于你的应用使用企业Microsoft账号登录(基于OAuth2/OIDC),还需处理身份提供商的令牌过期逻辑,这部分Azure门户无法直接配置。

现有配置的问题修正

你当前的application.yaml存在层级错误,session.cookie.max-age应归属到server.servlet.session节点下,否则配置不生效。修正后的配置如下:

# Session timeout
server:
  servlet:
    session:
      timeout: 30m
      cookie:
        max-age: 30m

另外,你自定义的Session类型Bean是冗余的,Spring Boot会自动读取上述配置并应用会话超时,无需手动创建该Bean,可直接删除。

针对Microsoft身份验证的代码修改

由于应用依赖Microsoft企业账号登录,需结合Spring Security OAuth2配置会话管理与令牌过期处理,确保闲置30分钟后彻底登出:

1. 配置Spring Security会话与登出策略

import org.springframework.context.annotation.Bean
import org.springframework.security.config.annotation.web.builders.HttpSecurity
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity
import org.springframework.security.web.SecurityFilterChain
import org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy
import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy
import org.springframework.security.web.session.HttpSessionEventPublisher

@EnableWebSecurity
class SecurityConfig {

    @Bean
    fun securityFilterChain(http: HttpSecurity): SecurityFilterChain {
        http
            .authorizeHttpRequests { auth ->
                auth.anyRequest().authenticated()
            }
            .oauth2Login { oauth2 ->
                // 此处保留你已有的Microsoft OAuth2客户端配置(如clientId、clientSecret等)
            }
            .logout { logout ->
                logout
                    .logoutSuccessUrl("/")
                    .invalidateHttpSession(true) // 会话过期时销毁HttpSession
                    .deleteCookies("JSESSIONID", "SESSION") // 清除会话相关Cookie
                    .clearAuthentication(true) // 清除身份验证信息
            }
            .sessionManagement { session ->
                session
                    .invalidSessionUrl("/login") // 会话失效后跳转登录页
                    .expiredUrl("/login?expired=true") // 会话过期后跳转带提示的登录页
                    .maximumSessions(1) // 可选:限制单用户仅能登录一次
            }
        return http.build()
    }

    // 确保会话创建时正确注册
    @Bean
    fun sessionAuthenticationStrategy(): SessionAuthenticationStrategy {
        return RegisterSessionAuthenticationStrategy()
    }

    // 监听会话销毁事件,保证会话过期逻辑触发
    @Bean
    fun httpSessionEventPublisher(): HttpSessionEventPublisher {
        return HttpSessionEventPublisher()
    }
}

2. 处理Microsoft令牌过期

Microsoft默认ID令牌过期时间为1小时,需配置令牌自动刷新或在会话超时后强制重新登录:

  • 若已配置refresh-token授权类型,Spring Security OAuth2会自动尝试刷新令牌;
  • 结合上述会话配置,当Servlet会话30分钟超时后,会清除本地身份验证信息,用户刷新页面时会被引导至Microsoft登录页重新认证。

验证配置生效

  • 打开浏览器开发者工具,查看JSESSIONID Cookie的过期时间是否为30分钟;
  • 闲置30分钟后刷新页面,确认是否需重新登录;
  • 查看应用日志,搜索SessionDestroyedEvent关键字,确认会话过期时是否触发销毁事件。

内容的提问来源于stack exchange,提问作者Krutika Pawar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 03:16:02