连接到Power BI API时接收“禁止​​(403)”

时间:2017-09-07 19:02:43

标签: azure azure-active-directory powerbi powerbi-embedded

我们一直在尝试关注this Power BI article,以便我们可以在SaaS产品中嵌入报告/信息中心。具体来说,我们陷入了第3步,“创建嵌入令牌”。

我们能够很好地获得持有人令牌但是当检索报告的请求最终提交给我们收到的API时:操作返回了无效的状态代码'禁止'

    private static string clientId = "...";
    private static string secretKey = "...";
    private static string groupId = "...";

    static void Main(string[] args)
    {
        string resourceUri = "https://analysis.windows.net/powerbi/api";
        string authorityUri = "https://login.windows.net/common/oauth2/authorize";

        ClientCredential credential = new ClientCredential(clientId, secretKey);
        AuthenticationContext authContext = new AuthenticationContext(authorityUri);

        var token = authContext.AcquireTokenAsync(resourceUri, credential).Result.AccessToken;

        var tokenCredentials = new TokenCredentials(token, "Bearer");

        using (var client = new PowerBIClient(new Uri("https://api.powerbi.com/"), tokenCredentials))
        {
            var reports = client.Reports.GetReportsInGroupWithHttpMessagesAsync(groupId);

            // !!! - Here's where the exception is thrown
            // !!! -- Operation returned an invalid status code 'Forbidden'
            var report = reports.Result.Body;
        }
    }

以下是我们尝试过的内容:

  • 已经授予了所需的权限(我们已经检查了所有权限以确保我们没有遗漏任何内容)。这包括Windows Azure Active Directory / Power BI服务。
  • 我们已确认客户端ID,密钥和组ID正确无误。
  • Power BI工作空间是私有的,但我们尝试制作一个公共工作空间以确保无关紧要。
  • 最后,我们通过代码收到的令牌与powerbi.com上的令牌相匹配。

4 个答案:

答案 0 :(得分:3)

您正在使用客户端凭据流获取Power BI API的令牌。目前,Power BI REST API仅支持委派权限,但不支持任何应用程序权限。因此您的访问令牌访问不足。要使用Power BI,身份验证需要基于特定用户。相关帖子herehere仅供参考。

根据您的document,该方案是app拥有对数据的访问权限。用户不一定是Power BI用户,应用程序控制最终用户的身份验证和访问。然后,您可以使用资源所有者流来获取令牌。

  
    

此示例可在App Owns Data sample.

的Controllers \ HomeController.cs中找到   

从代码示例中,它使用用户密码凭据来获取令牌,而不是应用程序的凭据:

            // Create a user password cradentials.
            var credential = new UserPasswordCredential(Username, Password);

            // Authenticate using created credentials
            var authenticationContext = new AuthenticationContext(AuthorityUrl);
            var authenticationResult = await authenticationContext.AcquireTokenAsync(ResourceUrl, ClientId, credential);

请参阅Authenticate users and get an Azure AD access token for your Power BI app并查看Access token for non-Power BI users (app owns data)部分。

答案 1 :(得分:0)

我们发现该组(App Workspace)需要由使用Azure进行身份验证的同一用户拥有。此用户还需要在您注册的Azure应用程序中列为所有者。一旦修改了权限。不要忘记重新发布powerbi报告,然后才会反映变化。

答案 2 :(得分:0)

从Power BI获取真实异常的最好方法是添加mypthon\Scripts\activate 并查看消息的标题/正文。

https://github.com/Microsoft/PowerBI-CSharp/compare/master...mikeblakeuk:feature/exceptionHandler

答案 3 :(得分:0)

这是因为您正在尝试使用SPN身份验证来调用``我的工作区''中的某些报告/仪表板。目前,这是SPN的已知限制

Reference

enter image description here