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

如何刷新Azure AD B2C (Angular) SPA应用的会话数据?

解答

不需要重定向到登录页,你可以通过MSAL提供的静默获取令牌接口在后台刷新会话数据,全程用户无感知。

你当前代码中读取的idTokenClaims是本地缓存的旧ID令牌内的声明,你通过Graph API更新用户属性后,AD B2C侧的用户数据已经更新,但本地缓存的令牌还没同步,所以拿到的始终是旧值。

你只需要在后端接口返回更新成功的结果后,调用acquireTokenSilent方法强制刷新令牌即可,MSAL会在后台和AD B2C交互拉取最新的令牌,自动更新本地缓存的账户信息、ID令牌、访问令牌,之后你再读取的会话数据就是最新值。

修改后的参考代码如下:

// user-data.service.ts
import { SilentRequest } from '@azure/msal-browser';

public updateUserRecord(userUpdateObj: CustomUserModel) {
  this.http.put("https://my-server-calling-graph-api.com/user-data", userUpdateObj ,this.HTTP_OPTIONS)
  .pipe(
    switchMap((updatedResult: CustomUserModel) => {
      console.log('Updated User Record -> ', updatedResult);
      // 构造静默获取令牌的请求参数
      const silentRequest: SilentRequest = {
        account: this.msalService.instance.getActiveAccount(),
        // 此处填写你实际使用的scope,和之前认证时的配置保持一致即可
        scopes: ['openid', 'profile']
      };
      // 静默刷新令牌,更新本地缓存的会话数据
      return this.msalService.instance.acquireTokenSilent(silentRequest);
    }),
    map((tokenResponse) => {
      // 此时读取的就是最新的用户声明
      const updatedUserClaims = tokenResponse.account.idTokenClaims;
      console.log('最新用户声明 -> ', updatedUserClaims);
      // 手动更新活跃账户,确保全局MSAL实例的数据都是最新的
      this.msalService.instance.setActiveAccount(tokenResponse.account);
    }),
    retry(2)
  ).subscribe();
}

注意事项

  • 请先确认你的AD B2C用户流/自定义策略已经配置了将对应的自定义属性返回到ID令牌中,否则即使刷新令牌也无法读取到更新后的属性值
  • 极端场景下如果静默获取令牌失败(比如刷新令牌过期),你可以捕获异常后调用acquireTokenRedirect或acquireTokenPopup触发用户交互重新认证,绝大多数正常使用场景下静默刷新都可以成功。

内容的提问来源于stack exchange,提问作者Prakash Mariappan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 19:36:04