Power BI - 获取嵌入令牌 - 未经授权

PowerBI - getting EmbedToken - Unauthorized

我一直在尝试获取一个嵌入令牌,以便能够将我的 powerbi 报告嵌入到我现有的 .netcore web api 应用程序中,但运气不佳。前端貌似power bi给我准备的超级easy 1 simple react组件

但是对于后端,我简直是在兜圈子。

我决定最简洁的方法是通过 HTTP 触发器函数。
(见此:https://www.taygan.co/blog/2018/05/14/embedded-analytics-with-power-bi

作为一个重要的旁注:我确实已经授予我的应用程序必要的委托 READ 权限来访问 power bi Apis)

另一方面,我正在尝试做主用户,应用拥有数据的方法

另一方面,您会看到我上面的 link,代码显示您使用不再支持(看似)的方法获取 AAD 身份验证令牌微软,所以我更改了那行代码,如下所示

using System;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using Microsoft.IdentityModel.Clients.ActiveDirectory;
using Microsoft.PowerBI.Api;
using Microsoft.PowerBI.Api.Models;
using Microsoft.Rest;
using Newtonsoft.Json;

namespace PowerBiExample
{
    public class EmbedContent
    {
        public string EmbedToken { get; set; }
        public string EmbedUrl { get; set; }
        public string ReportId { get; set; }
    }
    
    public static class Test
    {
        private static string tenantId = "this is the id of my entire organization";
         static string authorityUrl = $"https://login.microsoftonline.com/{tenantId}";
         static string resourceUrl = "https://analysis.windows.net/powerbi/api";
        static string apiUrl = "https://api.powerbi.com/";
        private static string clientId = "this is the client id of my application that i gave delegate permissions to"; 
        private static string clientSecret = "this is the secret of the application i gave delegate permissions to";
        private static string username = "ad master user that i WANTED to sign into power bi with";
        private static string password = "that ad users pw"; 
        private static Guid groupId = Guid.Parse("workspaceid in powerbi"); 
        private static Guid reportId = Guid.Parse("report id from within that workspace"); 
        
        
        [FunctionName("Test")]
        public static async Task<IActionResult> RunAsync(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req, ILogger log)
        {

            var credential = new ClientCredential(clientId, clientSecret);
            var authenticationContext = new AuthenticationContext(authorityUrl);
            // var authenticationResult = await authenticationContext.AcquireTokenAsync(resourceUrl, clientId, credential);
            var authenticationResult = await authenticationContext.AcquireTokenAsync(resourceUrl, credential);
            string accessToken = authenticationResult.AccessToken;
            var tokenCredentials = new TokenCredentials(accessToken, "Bearer");
    
            using (var client = new PowerBIClient(new Uri(apiUrl), tokenCredentials))
            {
                // Embed URL
                Report report = client.Reports.GetReportInGroup(groupId, reportId);
                string embedUrl = report.EmbedUrl;

                // Embed Token
                var generateTokenRequestParameters = new GenerateTokenRequest(accessLevel: "view");
                EmbedToken embedToken = client.Reports.GenerateTokenInGroup(groupId, reportId, generateTokenRequestParameters);

                // JSON Response
                EmbedContent data = new EmbedContent();
                data.EmbedToken = embedToken.Token;
                data.EmbedUrl = embedUrl;
                data.ReportId = reportId.ToString();
                var s = JsonConvert.SerializeObject(data);
                return new JsonResult(s);
                // JavaScriptSerializer js = new JavaScriptSerializer();
                // string jsonp = "callback(" +  js.Serialize(data) + ");";
                //
                // // Return Response
                // return new HttpResponseMessage(HttpStatusCode.OK) 
                // {
                //     Content = new StringContent(jsonp, Encoding.UTF8, "application/json")
                // };
            }
        }
    }
}

我确实得到了返回的授权令牌。我没有得到返回的嵌入令牌。我因此获得了授权。

另外重要说明:1. 我也没有像这里说的那样启用服务主体 docs.microsoft。com/en-us/power-bi/enterprise/…(我的 IT 部门说我可以't).和 2. 他们不是工作区的管理员或成员,但是当我尝试将他们添加为成员时,他们不可用。它是一个应用程序,而不是用户或组。我该怎么办

请检查以下几点是否可以提供解决方法。

  1. 可能需要 fiddler 跟踪才能进一步调查。所需 已注册的应用程序可能缺少权限范围 在 Azure AD 中。 Verify the required scope 存在于 Azure 门户中 Azure AD 的应用程序注册,例如:openid, 个人资料,离线等取决于要求和用户 已登录。

When using a master user, you'll need to define your app's delegated permissions ( known as scopes). The master user or Power BI admin is required to grant consent for using these permissions using the Power BI REST APIs.

  1. 对于高级用户来说,grant permissions从 Azure 门户。
  2. 还要检查提供的群组ID是否正确,
  3. 同样对于 Analysis Services,主用户 必须是 网关管理员.

Note: For security reasons, the lifetime of the embed token is set to the remaining lifetime of the Azure AD token used to call the GenerateToken API.

因此,如果您使用相同的 Azure AD 令牌生成多个嵌入令牌,生成的嵌入令牌的生命周期会随着每次调用而缩短。 有时这可能是由于嵌入令牌过期导致未经授权错误的原因

还要检查是否需要提供datasetId

部分参考资料:

  1. 对 GetReportInGroupAsync PowerBI Embedded 的未授权响应 API 使用服务主体调用 - 堆栈溢出
  2. 注册应用程序以将 Power BI 内容嵌入 Power BI 嵌入式 分析应用程序 - Power BI |微软文档
  3. 了解嵌入 Power BI 所需的权限令牌 应用-Power BI |微软文档