从SPA调用Web API遇Azure AD B2C错误:令牌缺失scp或roles声明
问题原因及解决办法
核心问题1:令牌请求用错了Client ID
你当前请求令牌时填的client_id: api_appid是Web API的应用ID,但SPA作为客户端,请求令牌时必须使用SPA应用自己的Client ID。Azure AD B2C会根据客户端ID和授予的权限,在令牌中注入对应的scp(范围)声明,用错Client ID的话,令牌里不会包含目标API的权限声明。
核心问题2:确认权限配置的完整性
即使修正了Client ID,还要检查以下两点:
- 确保在SPA应用的API权限列表里,
api.read权限的状态是已授予管理员同意(Azure AD B2C中需要手动点击授予,否则用户登录时不会获取到该权限的声明)。 - 检查你使用的用户流,确保在用户流的「应用程序声明」中,勾选了**范围(scp)**选项,这样令牌才会包含
scp字段。
修正后的令牌请求示例
把client_id替换为SPA应用的ID,其他参数保持不变:
POST https://tenant.b2clogin.com/tenant.onmicrosoft.com/policy/oauth2/v2.0/token grant_type: authorization_code client_id: spa_appid # 替换为SPA应用的Client ID scope: https://tenant.onmicrosoft.com/web_api/api.read redirect_uri: https://localhost:435 code: [授权码] code_verifier: [验证器]
验证令牌内容
拿到新令牌后,用本地JWT解码工具查看是否包含scp字段且值为api.read,确认无误后再调用Web API即可解决报错。
内容的提问来源于stack exchange,提问作者Akhil737
相关产品推荐
相关产品推荐

