Azure AD B2C+MSAL JS调用AcquireTokenAsync遇AADB2C90055错误求助
解决AADB2C90055错误:作用域需指定资源的问题
这个错误我之前也碰到过,核心原因是你混淆了ID令牌和访问令牌的获取逻辑,以及对应的作用域使用方式。咱们一步步来解决:
先搞懂错误根源
AADB2C90055 报错是因为你用了获取API访问令牌的方法(比如AcquireTokenAsync),但传入的是openid profile这类属于ID令牌的作用域。ID令牌的作用域不需要绑定资源,但获取访问令牌的请求必须明确指定对应的API资源——哪怕你的客户端和API用同一个Client ID,也得按规则来。
具体解决步骤
1. 区分两种令牌的获取方式
如果你的需求是刷新用户身份会话(获取ID令牌):
不要用AcquireTokenAsync,改用MSAL的静默刷新方法针对ID令牌作用域操作。比如在Angular里可以这么写:// 先获取当前登录账户 const activeAccount = this.msalService.instance.getActiveAccount(); if (activeAccount) { const refreshRequest = { account: activeAccount, scopes: ["openid", "profile"] }; try { // 静默刷新ID令牌 const response = await this.msalService.instance.acquireTokenSilent(refreshRequest); // 这里可以拿到更新后的idToken } catch (err) { // 静默失败就弹出登录框重新获取 await this.msalService.instance.acquireTokenPopup(refreshRequest); } }如果你的需求是调用API(获取访问令牌):
必须使用API专属的作用域,格式是api://{你的Client ID}/{自定义作用域名},比如api://xxxxxx/access_as_user。代码调整如下:// 替换成你实际的API作用域 const apiScopes = ["api://{your-client-id}/access_as_user"]; const tokenRequest = { account: this.msalService.instance.getActiveAccount(), scopes: apiScopes }; try { const response = await this.msalService.instance.acquireTokenSilent(tokenRequest); // 用response.accessToken去调用你的API } catch (err) { await this.msalService.instance.acquireTokenPopup(tokenRequest); }
2. 检查Azure AD B2C的应用配置
因为你的客户端和API共用同一个Client ID,要确保:
- 在Azure AD B2C的应用配置里,API权限部分已经添加了自身作为API,并勾选了需要的作用域(比如
access_as_user)。 - 应用的隐含流设置中,已经勾选了
ID令牌选项(如果需要用openid作用域获取ID令牌的话)。
3. 记住关键规则
- ID令牌(
id_token):用来验证用户身份,作用域包含openid、profile,不需要绑定API资源。 - 访问令牌(
access_token):用来调用受保护API,必须绑定具体的API资源/作用域,格式严格遵循{资源标识符}/{作用域}。
内容的提问来源于stack exchange,提问作者Boland
相关产品推荐
相关产品推荐

