Power BI嵌入问题

时间:2019-06-04 16:55:05

标签: powerbi

我正在使用功能强大的BI Visual Studio解决方案进行一些研发,并且正在努力以编程方式嵌入内容。我有Power BI Pro试用版。

我从Embed Setup网页创建了一个应用程序(“用户拥有数据”和示例数据),并下载了示例VS解决方案,该解决方案已为刚刚创建的应用程序配置了GUID。该应用程序出现在我的Power BI Web界面中,当我运行VS Web应用程序时,我得到三个按钮(嵌入报告|嵌入仪表板|嵌入磁贴)。可行-我可以查看嵌入式报告。

我的问题是,当我使用Power BI界面安装应用程序,然后尝试使用刚刚安装的应用程序的appId运行我的VS项目时。例如-我安装了Github应用程序并选择使用示例数据。如果我在VS项目中插入appId,工作区ID和报告ID,则在运行它时会收到以下消息,然后单击“嵌入报告”按钮

AADSTS700016: Application with identifier '5c7d26d1-006d-43ac-9eb7-6aa3e1f6b364' was not found in the directory 'foo.onmicrosoft.com'. This can happen if the application has not been installed by the administrator of the tenant or consented to by any user in the tenant. You may have sent your authentication request to the wrong tenant.
Trace ID: e77376aa-b7ca-4c09-9184-31f96eea9800
Correlation ID: d42a0b9c-c93d-4601-87d6-05d9cca70e0d
Timestamp: 2019-06-04 15:59:58Z

为什么我使用“嵌入设置”页面创建的应用程序可以运行,但是另一个应用程序的ID却因该错误而失败? 我在VS项目中使用的登录凭据与登录Power BI网站时使用的登录凭据以及在“嵌入设置”页面中创建应用程序时使用的登录凭据相同。

是否正在寻找在我的Azure门户的Active Directory> App Registrations下注册的应用程序?如果是这样,为什么其他Power BI应用程序可以工作(“嵌入设置”路由)?

当我测试使用“应用拥有的数据”创建应用时,该应用已在我的Azure AD中注册

作为旁注-是否有一种简单的方法来获取应用程序,工作区和报告应用程序的ID? AppId很容易从URL中获取,但是似乎从未出现工作区ID

更新 按照建议使用@Andrey使用“内置嵌入工具”后,我确实看到该应用程序已在Azure中注册,但是如果将applicationId web.config密钥替换为Azure应用程序的ID,则会收到不同的错误消息(下面)。我相信生成项目的web.config中的applicationId int特别是(Power BI)应用程序ID,而不是Azure应用程序ID(Microsoft一点都不困惑!)。使用Azure应用程序ID,出现以下错误:

Error
            AADSTS7000218: The request body must contain the following parameter: 'client_assertion' or 'client_secret'.
Trace ID: 5e8391c2-4681-4c8e-9294-a99fd56dbb00
Correlation ID: 10d48927-d5ec-45bd-a5b3-e9c1e147f97c
Timestamp: 2019-06-05 15:29:44Z

我觉得我需要一些文档,但是找不到。我已经创建了出现在Azure中的应用程序(我之前已经做过,但是找不到该应用程序和PowerBI页面之间的任何连接)。我已经在Power BI中创建了应用程序,工作区和报告。我要做的就是使用.Net SDK从特定的Power BI安装中获取可视化效果,即将客户数据的可视化效果插入其网站。

找到解决方案后,我会继续挖掘和更新

2 个答案:

答案 0 :(得分:1)

您正在混合两个不同的“应用程序ID”。第一个应用程序ID(也称为客户端ID)是您在新加入的嵌入工具(https://dev.powerbi.com/apps)中注册的ID,我相信这就是您所说的“嵌入设置”(或者嵌入设置是最重要的东西) )。之后,此应用程序注册将在Azure AD中可见。您提到的另一个“应用程序”是“ Power BI App”,即在一个应用程序中打包在一起的报告的集合。这两个“应用”完全不同,并且在嵌入Power BI元素时不能使用后一个的ID。

打开保存在工作区中的报表时,URL将采用以下格式:

https://app.powerbi.com/groups/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/reports/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/ReportSection

第一个向导(groups之后的x-es)是工作区ID(也称为组ID)。后一个(在reports之后)是报告ID。没有“应用程序的工作区和报告ID”,因为您的应用程序(您注册并在Azure AD中可见的应用程序)可以访问各种工作区中的各种报告。 “ Power BI应用程序”中包含的报告应从其原始工作区而不是应用程序中嵌入。

答案 1 :(得分:0)

我最终找到了我要寻找的solution。本质上,您使用PowerBI C#SDK进行身份验证并返回您的PowerBI数据(例如报告集合),然后可以使用JS API嵌入这些数据

private async Task<AuthenticationResult> DoAuthentication()
{
    AuthenticationResult authenticationResult = null;
    if (AuthenticationType.Equals("MasterUser"))
    {
        var authenticationContext = new AuthenticationContext(AuthorityUrl);

        // Authentication using master user credentials
        var credential = new UserPasswordCredential(Username, Password);
        authenticationResult = authenticationContext.AcquireTokenAsync(ResourceUrl, ApplicationId, credential).Result;
    }
    else
    {
        // For app only authentication, we need the specific tenant id in the authority url
        var tenantSpecificURL = AuthorityUrl.Replace("common", Tenant);
        var authenticationContext = new AuthenticationContext(tenantSpecificURL);

        // Authentication using app credentials
        var credential = new ClientCredential(ApplicationId, ApplicationSecret);
        authenticationResult = await authenticationContext.AcquireTokenAsync(ResourceUrl, credential);
    }

    return authenticationResult;
}

然后,获取报告列表

    public IList<Report> GetReportsByGroup(string groupId)
    {
        if (_reports == null)
        {
            var Client = new PowerBIClient(new Uri(ApiUrl), new TokenCredentials(AccessToken, "Bearer"));
            _reports = Client.Reports.GetReportsInGroup(groupId).Value;
        }
        return _reports;
    }
相关问题