非管理员用户如何在AAD v2端点为原生应用注册授予Power BI Embedded权限?
解决Power BI Embedded应用在AAD v2.0注册中无法批量授予用户权限的问题
你的核心困境很明确:旧版v1.0应用注册里的「授予权限」按钮(能让租户内所有用户自动同意权限)在v2.0中被移除,而你没有管理员权限无法点击「授予管理员同意」。好在你添加的所有权限都是无需管理员同意的委托权限,可以通过以下几种方式解决:
1. 引导用户手动完成权限同意
因为你的权限都属于用户可自主同意的类型,每个用户第一次访问应用时,会自动触发AAD的权限授权弹窗:
- 用户打开你的React应用,触发Power BI嵌入流程时,会跳转到AAD的权限确认页面
- 用户核对需要授权的权限列表后,点击「同意」
- 完成授权后,用户就能正常访问Power BI报表和仪表板
这个方法零额外操作,适合用户量不大的场景,唯一的缺点是每个用户都要手动操作一次。
2. 用PowerShell批量触发用户权限同意
如果需要批量处理租户内用户的权限同意,可以借助Microsoft Graph PowerShell模块实现,不需要管理员权限(因为权限是用户可自主同意的):
- 先安装Microsoft Graph模块:
Install-Module Microsoft.Graph -Force - 连接到Microsoft Graph(用你的Power BI Pro账户或目标用户账户均可):
Connect-MgGraph -Scopes "User.Read" - 针对单个用户执行权限同意:
# 替换为你的应用客户端ID和目标用户UPN $clientId = "your-app-client-id" $userUpn = "target-user@your-tenant.com" # 填入你需要授权的所有权限范围 $scopes = @("User.Read", "Capacity.Read.All", "Capacity.ReadWrite.All", "Content.Create.All", "Dashboard.Read.All", "Dashboard.ReadWrite.All", "Dataset.ReadWrite.All", "Group.Read", "Report.ReadWrite.All", "Workspace.Read.All", "Workspace.ReadWrite.All") # Power BI Service的固定服务主体ID,无需修改 $powerBiServicePrincipalId = (Get-MgServicePrincipal -Filter "appId eq '00000003-0000-0000-c000-000000000000'").Id $userId = (Get-MgUser -UserId $userUpn).Id New-MgOauth2PermissionGrant -ClientId $clientId -ConsentType "Principal" -PrincipalId $userId -ResourceId $powerBiServicePrincipalId -Scope ($scopes -join " ") - 批量处理的话,只需循环遍历用户列表,重复执行上述授权命令即可。
3. 在应用登录流程中提前请求权限
你可以把权限范围直接嵌入React应用的登录请求里,让用户在登录时一次性完成权限同意,避免后续访问Power BI内容时再触发授权弹窗。以MSAL.js为例:
import { PublicClientApplication } from "@azure/msal-browser"; const msalConfig = { auth: { clientId: "your-app-client-id", authority: "https://login.microsoftonline.com/your-tenant-id", } }; const pca = new PublicClientApplication(msalConfig); // 把所有需要的权限包含在登录请求中 const loginRequest = { scopes: ["User.Read", "Capacity.Read.All", "Capacity.ReadWrite.All", "Content.Create.All", "Dashboard.Read.All", "Dashboard.ReadWrite.All", "Dataset.ReadWrite.All", "Group.Read", "Report.ReadWrite.All", "Workspace.Read.All", "Workspace.ReadWrite.All"] }; pca.loginPopup(loginRequest) .then(response => { // 登录&授权成功,处理后续逻辑 }) .catch(error => { // 处理登录或授权错误 });
关键注意事项
- 务必确认所有权限的「需要管理员同意?」状态为「否」:可以在Azure门户的应用注册>API权限页面查看,这是上述方法可行的前提。
- 如果有任何权限需要管理员同意,那必须联系租户管理员完成「授予管理员同意」——这是AAD v2.0的安全设计,没有绕过途径。
内容的提问来源于stack exchange,提问作者C. Fabiani
相关产品推荐
相关产品推荐

