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

Azure B2C SPA应用单点登出(SLO)实现及配置疑问

Azure B2C SPA单点登出(SLO)实现指南

核心限制说明

Azure B2C目前对SPA应用存在平台限制:无法在应用注册界面配置「前端通道登出URL」,官方的iframe通知登出机制仅支持后端应用(如Web App),SPA无法利用该机制让B2C主动通知其他已登录的SPA完成登出。


问题逐一解答

1. 在哪里添加应用的登出URL?

由于SPA没有对应的配置项,无法通过B2C的原生前端通道机制注册登出URL。需要自行实现跨应用的登出同步逻辑,而非依赖B2C主动推送登出请求。

2. 「手动清除本地存储或通过应用进行处理」是什么意思?

SPA的用户会话数据(比如存在localStorage/sessionStorage中的ID Token、Access Token、用户信息)完全存储在浏览器端,B2C无法直接操作这些数据。因此:

  • 当用户触发登出时,当前SPA必须主动清除自身存储的所有会话相关数据
  • 其他SPA需要通过主动检查或消息监听的方式,同步清除自己的会话数据

3. 如何手动清除Cookie?

Cookie分两种情况处理:

  • B2C全局会话Cookie:调用B2C的官方登出端点即可清除:
    https://<your-tenant-name>.b2clogin.com/<your-tenant-name>.onmicrosoft.com/<PolicyName>/oauth2/v2.0/logout?post_logout_redirect_uri=https://app1.mydomain.com/logout-complete
    
  • SPA自有Cookie:通过JavaScript代码清除,需匹配Cookie的domain和path,示例:
    // 清除子域名下的Cookie
    document.cookie = "spa_session=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/; domain=.mydomain.com;";
    

4. 能否修改前端通道登出URL为自有域名?

不行,B2C的前端通道登出URL是固定的系统端点,无法自定义为自有域名。但可以调整SPA的登出流程:

  1. 当前SPA先清除自身的本地存储和Cookie
  2. 跳转到B2C的登出端点,清除全局会话
  3. B2C完成登出后,重定向回你在应用注册中配置的「登出重定向URL」

5. 是否必须在刷新时用静默刷新检查令牌?

这是一种可靠的兜底方案:

  • 每个SPA在页面加载/刷新时,调用B2C的静默刷新接口(acquireTokenSilent)获取新令牌
  • 如果静默刷新失败,说明用户已在B2C端登出,此时立即清除本地会话数据并跳转至登录页
  • 这种方式能保证多SPA之间的会话状态最终一致,即使跨应用的消息同步出现遗漏

推荐的跨SPA登出实现方案

结合两种方式实现完整的SLO:

  1. 实时消息同步:使用浏览器Broadcast Channel API,当一个SPA发起登出时:
    // 发起登出的SPA代码
    const channel = new BroadcastChannel('b2c-slo-channel');
    // 清除自身会话数据
    localStorage.removeItem('id_token');
    sessionStorage.clear();
    // 发送登出通知
    channel.postMessage({ action: 'logout' });
    // 跳转到B2C登出端点
    window.location.href = 'https://<tenant>.b2clogin.com/<tenant>.onmicrosoft.com/<policy>/oauth2/v2.0/logout?post_logout_redirect_uri=https://app1.mydomain.com/logout-complete';
    
    其他SPA监听消息并同步处理:
    // 其他SPA的监听代码
    const channel = new BroadcastChannel('b2c-slo-channel');
    channel.onmessage = (e) => {
      if (e.data.action === 'logout') {
        // 清除自身会话数据
        localStorage.removeItem('id_token');
        sessionStorage.clear();
        // 跳转至登录页或提示用户已登出
        window.location.href = '/login';
      }
    };
    
  2. 静默刷新兜底:在每个SPA的页面初始化逻辑中加入静默刷新检查,确保即使消息未被接收,也能在页面刷新时同步状态。

内容的提问来源于stack exchange,提问作者Christian Matthew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 05:07:40