Angular SPA集成Azure B2C登录后调用MSAL Token遇AADB2C90077错误
解决Azure B2C Angular应用中AADB2C90077令牌获取错误的方案
我之前也碰到过一模一样的问题,当时折腾了好一阵才搞定,给你分享几个亲测有效的解决思路:
把控静默请求的触发时机
登录重定向完成后,MSAL需要一点时间把令牌持久化到存储里。如果页面刚加载就立刻调用acquireTokenSilent这类静默获取方法,很可能存储还没就绪,直接抛出这个错误。建议你在handleRedirectObservable的回调确认登录结果后,再执行令牌相关逻辑:this.msalService.handleRedirectObservable().subscribe({ next: (result) => { if (result?.account) { // 确认登录成功后再调用令牌获取方法 this.fetchProtectedData(); } }, error: (err) => console.error('重定向处理失败:', err) });调整静默请求的
prompt参数逻辑
错误提示明确提到prompt参数是None,这意味着静默请求不允许弹出登录界面。如果存储里的令牌和Azure B2C的实际会话不同步(比如会话过期但令牌还在),就会触发这个报错。你可以在捕获到该错误时,主动切换为交互式登录:async getAccessToken() { try { const response = await this.msalService.acquireTokenSilent({ scopes: ['https://your-b2c-tenant.onmicrosoft.com/api/access'], prompt: 'none' }); return response.accessToken; } catch (err) { if (err.errorMessage.includes('AADB2C90077')) { // 会话失效,触发交互式登录重新获取 this.msalService.loginRedirect({ scopes: ['https://your-b2c-tenant.onmicrosoft.com/api/access'] }); } throw err; } }同步存储与实际会话状态
有时候存储里残留的旧令牌信息会和Azure B2C的实际会话脱节,导致静默请求失败。可以在应用启动时做一次状态校验,发现异常就清理无效账户并重新登录:ngOnInit() { const activeAccount = this.msalService.instance.getActiveAccount(); if (activeAccount) { this.msalService.acquireTokenSilent({ scopes: ['your-api-scopes'] }) .catch(err => { if (err.errorMessage.includes('AADB2C90077')) { this.msalService.instance.removeAccount(activeAccount); this.msalService.loginRedirect(); } }); } }检查Azure B2C的会话配置
最后可以登录Azure门户,查看B2C租户的会话设置——比如会话超时时间、是否允许跨域会话等。如果会话超时设置过短,可能刚登录就出现会话失效的情况,调整后能缓解这类问题。
内容的提问来源于stack exchange,提问作者Cloud guy
相关产品推荐
相关产品推荐

