You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一认证令牌下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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 23:42:29