如何刷新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
相关产品推荐
相关产品推荐

