同一认证令牌下User.ReadBasic.All与Report.Read.All权限冲突问题
解决添加User.ReadBasic.All后Power BI接口返回403的问题
问题根源
你遇到的问题是因为访问令牌的权限范围不匹配:当添加User.ReadBasic.All作用域后,如果获取令牌时没有同时包含Power BI的Report.Read.All,或者令牌的受众(audience)仅指向Microsoft Graph API,调用Power BI接口时就会因权限不足触发403。
具体解决步骤
1. 一次性请求所有必要作用域
发起OAuth授权或令牌请求时,必须把所有需要的作用域放在一起,不能拆分请求。正确的作用域列表应该是:
openid profile offline_access https://analysis.windows.net/powerbi/api/Report.Read.All User.ReadBasic.All
如果分两次获取令牌(一次拿Power BI权限,一次拿Graph权限),第二次的令牌会覆盖前者,导致调用Power BI时用的是只有Graph权限的令牌,自然会被拒绝。
2. 检查令牌内容是否符合要求
用jwt.ms解析你获取到的访问令牌,重点看两个字段:
- scp:必须同时包含
Report.Read.All和User.ReadBasic.All,缺一个都不行 - aud:调用Power BI接口时,令牌的aud得是
https://analysis.windows.net/powerbi/api;调用Graph的/me接口时,aud得是https://graph.microsoft.com。如果需要同时调用两个API,优先分别获取对应受众的令牌。
3. 确认Azure AD应用的权限配置
登录Azure门户,检查你的应用:
- 是否同时添加了Power BI Service的
Report.Read.All(委派权限)和Microsoft Graph的User.ReadBasic.All(委派权限) - 这些权限是否已经完成同意操作:企业租户应用需要管理员同意,个人应用则需要用户首次授权时同意。
4. 调整代码中的令牌逻辑
在PHP代码里,确保获取令牌的请求参数包含完整的作用域列表。举个例子:
$requiredScopes = 'openid profile offline_access https://analysis.windows.net/powerbi/api/Report.Read.All User.ReadBasic.All'; // 将该作用域字符串传入你的OAuth令牌请求逻辑中
另外,调用不同API时要对应使用正确的令牌:调用Power BI用带Power BI权限的令牌,调用Graph用带Graph权限的令牌,别搞混。
快速排查清单
- ✅ 授权请求的作用域是否完整包含两类权限?
- ✅ 令牌的scp字段是否同时有
Report.Read.All和User.ReadBasic.All? - ✅ Azure应用的权限是否都添加并完成同意?
- ✅ 调用Power BI接口时用的令牌aud是否正确?
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

