使用服务主体对GetReportInGroupAsync PowerBI嵌入式API调用的未经授权的响应

问题描述

我正在尝试将Power BI报告嵌入到我的.Net Core应用程序中,但是无法从请求中获得有效的响应。我正在使用Microsoft.PowerBI.API程序包和带有服务主体的Azure应用注册。

据我所知,我已经按照此处的说明使用正确的权限设置了AAD和服务主体: https://docs.microsoft.com/en-us/power-bi/developer/embedded/embed-service-principal

在要将该安全组添加到Power BI管理门户中的管理设置之前,我遇到了必须将AAD /服务主体添加到安全组的部分。

这是我正在使用的代码段:

var AuthorityUrl = "https://login.microsoftonline.com/common/";
var ResourceUrl = "https://analysis.windows.net/powerbi/api";

var authenticationContext = new AuthenticationContext(AuthorityUrl);
AuthenticationResult authenticationResult = null;
var credential = new ClientCredential("application_id","application_secret");
authenticationResult = await authenticationContext.AcquireTokenAsync(ResourceUrl,credential);

using (var client = new Microsoft.PowerBI.Api.PowerBIClient(new Uri("https://api.powerbi.com/"),new TokenCredentials(authenticationResult.AccessToken,"Bearer")))
{
    var report = await client.Reports.GetReportInGroupAsync(new Guid("workspace_id"),new Guid("report_id"));
}

我成功从AcquireTokenAsync调用中获取了令牌,但是在获取报告时却遭到了未经授权。

以下是我在Azure中的AAD /服务负责人的权限:

azure aad api permissions

这是我用Fiddler捕获的请求/响应。 请求:

GET https://api.powerbi.com/v1.0/myorg/groups/{workspace_id}/reports/{report_id} HTTP/1.1
Authorization: Bearer {access_token}
User-Agent: FxVersion/4.6.28207.03 OSName/Windows OSVersion/Microsoft.Windows.10.0.18362. Microsoft.PowerBI.Api.PowerBIClient/3.14.01300.0002
Host: api.powerbi.com

响应:

HTTP/1.1 401 Unauthorized
Content-Length: 0
Strict-Transport-Security: max-age=31536000; includeSubDomains
X-Frame-Options: deny
X-Content-Type-Options: nosniff
Access-Control-Expose-Headers: RequestId
request-redirected: true
home-cluster-uri: https://wabi-west-us-redirect.analysis.windows.net/
RequestId: {request_id}
Date: Thu,10 Sep 2020 16:23:07 GMT

任何帮助将不胜感激!

解决方法

要使Service Principal适用于任何嵌入,您需要在Power BI Admin门户中启用Service Principal选项,然后将其添加到Power BI工作区中。

请检查一下以下内容:

  1. 检查是否在Power BI服务的管理门户下启用了服务主体。 继续关注step 3
  2. 如果按照上述步骤操作后仍然无法解决问题,请尝试与开发者sample嵌入

此外,根据您的代码,您似乎正在使用ADAL库进行身份验证。 Microsoft recommends to use MSAL library用于与Azure AD实体进行身份验证。
另外,您可以使用证书代替应用程序密码进行服务主体身份验证。 (Docs

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...