Azure AD中Power BI REST API的Access Token Scope问题排查
使用Power BI REST API时,通过React应用的@azure/msal-browser和@azure/msal-react库获取Azure AD令牌失败,报错:
invalid_client: AADSTS650053: The application 'dashboard.xyz.work' asked for scope 'Dataset.ReadWrite.All' that doesn't exist on the resource '00000003-0000-0000-c000-000000000000'. Contact the app vendor. Trace ID: 77e47883-fdd3-444a-bdd3-9f3a53bc1500 Correlation ID: aa77d724-0d9f-41aa-8e47-251c6b6f9293 Timestamp: 2023-02-09 13:51:46Z
相关配置信息:
- Azure AD SPA应用:已开启公共客户端流,重定向URI设为
http://localhost:4200,添加了Power BI的Dataset.ReadWrite.All等权限 - MSAL配置:
const configuration: Configuration = { auth: { clientId: "myclientidhere", authority: "https://login.microsoftonline.com/mytenantidhere", redirectUri: "http://localhost:4200/", }, cache: { cacheLocation: "localStorage", storeAuthStateInCookie: false, }, }
- 登录请求scope:
export const loginRequest = { scopes: ["Dataset.ReadWrite.All"] };
已知切换为user.read等Microsoft Graph scope可正常获取令牌,Power BI相关scope无法获取;且资源ID 00000003-0000-0000-c000-000000000000对应Microsoft Graph,Power BI权限属于资源https://analysis.windows.net/powerbi/api(ID 00000009-0000-0000-c000-000000000000)。
1. 修改登录请求的scope格式
Power BI的scope必须明确指定所属的资源前缀,格式为https://analysis.windows.net/powerbi/api/<scope-name>,修改后的loginRequest如下:
export const loginRequest = { scopes: ["https://analysis.windows.net/powerbi/api/Dataset.ReadWrite.All"] };
若需要多个Power BI权限,可添加多个带前缀的scope:
export const loginRequest = { scopes: [ "https://analysis.windows.net/powerbi/api/Dataset.ReadWrite.All", "https://analysis.windows.net/powerbi/api/Report.ReadWrite.All" ] };
2. 验证权限配置
确保Azure AD应用中添加的是Power BI Service的委托权限(而非Microsoft Graph权限);若该权限需要管理员同意,需先完成管理员授权操作(用户自身拥有权限仅适用于无需管理员同意的权限类型)。
当仅填写Dataset.ReadWrite.All这类scope名称时,MSAL会默认将资源指向Microsoft Graph(资源ID 00000003-...),但该scope实际属于Power BI API服务,因此必须通过添加资源前缀明确告知Azure AD该scope对应的目标服务,避免资源匹配错误。
内容的提问来源于stack exchange,提问作者navinrangar

