通过 Power BI 嵌入式分析,可以将 Power BI 内容(例如报表、面板和磁贴)嵌入到 Web 应用程序或网站中。很多客户都有这样的需求,如果看的人多,报表统一公开,统一管理,使用嵌入方案可以节约很多成本,Power BI Embedded的使用过程比较繁琐,而且文档中未有国内版本的实际操作,我通过实践,发现还是使用demo模拟过程中发现了很多有趣坑,最终成功的运行了。

另外发现嵌入也可以使用RLS,也进行了模拟,这个功能很不错,可以实现外部用户登录应用时候也进行行级安全管理。稍作点复杂的开发。就可以把powerbi当作后台,而前端自己开发集中的报表展示中心

1、准备工作

为了快速搞定程序,使用了微软的原版Demo进行测试。

下载下面代码:
https://github.com/microsoft/PowerBI-Developer-Samples
​

下载后

可以看到代码包括:.NET Core, NET Framework ,NodeJS 等代码

我使用.Net Core 和 NodeJS 代码进行了测试 。代码中,发现.Net Core 写的比较好,配置改动后,代码就可以运行,但是NodeJS就无法运行,需要改动很多地方,下面慢慢来说。

2、基本概念

代码打开可以看到,每个代码都有两种情况

就是为客户集成或者为组织集成

这两种的区别:

下表比较了这两种 Power BI 嵌入式分析解决方案。

为客户嵌入内容 为组织嵌入内容
也称为“应用拥有数据” 也称为“用户拥有数据”
面向外部用户 面向内部用户
若要验证应用用户的身份,请使用自己的身份验证方法 应用用户针对 Azure AD 进行身份验证
应用用户不需要许可证 每个应用用户都需要 Power BI 许可证
非交互式身份验证。 Web 应用使用服务主体或主用户进行身份验证 交互式身份验证。 应用使用应用用户的凭据进行身份验证

从两种情况比较,客户大部分需要的是 为客户嵌入内容

为客户嵌入内容 也有两种情况,一种是使用服务主体或者主用户身份进行验证。 下表描述了服务主体与主用户身份验证方法之间的一些主要差异。

注意事项 服务主体 主用户
机制 Azure AD 应用的服务主体对象允许 Azure AD 向 Power BI 对嵌入式解决方案应用进行身份验证。 Azure AD 应用使用 Power BI 用户的凭据(用户名和密码)向 Power BI 进行身份验证。
安全性 服务主体是 Azure AD 建议的授权方法。 如果使用服务主体,*则可使用应用程序机密或证书进行身份验证。 此身份验证方法不如使用服务主体安全。 这是因为必须警惕主用户凭据(用户名和密码)。 例如,不能在嵌入的应用程序中公开它们,而应经常更改密码。
Azure AD 委托的权限 不需要。 你的主用户或管理员必须授予你的应用访问 Power BI REST API 权限(也称为范围)的许可。 例如 Report.ReadWrite.All。
Power BI 服务的访问 无法使用服务主体访问 Power BI 服务。 可使用主用户凭据访问 Power BI 服务。
许可证 不需要 Pro 许可证。 可使用任何工作区中的内容(如果你是该工作区的成员或管理员)。 需要 Power BI Pro 或 Premium Per User (PPU) 许可证。

所以应用程序需要的参数有如下参数;

参数 服务主体 主用户
客户端 ID

工作区 ID

报表 ID

客户端机密

租户 ID

Power BI 用户名

Power BI 密码

3、环境部署

3.1、创建- 注册 Azure AD 应用程序

1、注册Azure AD 应用程序,有一个工具访问:Onboarding Embed Tool (powerbi.cn)

https://app.powerbi.cn/apps
来注册应用

2、注册应用的基本信息:

两个关键信息:1、displayname,2、homepageurl,测试地址我的是http://localhost:5300/,正式发布需要修改这个地址

3、api权限,选择相应的权限。根据需要进行选取,需要实验,我全选了

4、添加所有者

打开Azure Portal 找到应用注册,找到刚才注册的应用,点击所有者,添加所有者,将powerbi的用户添加到列表中。

5、创建密钥

点击证书和密钥,点击新客户密钥,输入说明

生成新的密钥,需要密钥保存值,之后无法进行查看。

6、记录参数

点击 概述,找到相应的概要:

获取:

应用程序(客户端) ID、

目录(租户) ID

密钥(上面复制的密码保存)

3.2、Power BI设置

1、在 Power BI 服务中,选择“设置”>“设置”>“管理员门户”

2、选择“租户设置”,然后向下滚动到“开发人员设置”部分 。

3、展开“允许服务主体使用 Power BI API”,然后启用此选项。

3.2、创建 Power BI 工作区

1、访问 app.powerbi.cn

2、创建 新工作区,不能使用默认工作区

3、点击工作区更多->工作区访问:

4、点击添加

输入上一步注册的应用的名称,选择为管理员或者参与者 点击 添加

另外需要

记录工作区ID :

点击工作区后,在浏览器地址选择 groups后面的guid 就是工作区id

3.3、创建并发布 Power BI 报表

创建一个Power BI报表,并发布,此过程不进行叙述

点开报表后,浏览器地址栏选择repots之后的guid 记录,为报表id

3.4、获取嵌入的参数值

参数 服务主体 主用户
AuthenticationMode 服务主体 MasterUser
ClientId Azure 应用客户端 ID。 Azure 应用客户端 ID。
TenantId Azure AD 租户 ID 空值
PbiUsername 空值 主用户的用户名,请参阅 Power BI 用户名和密码
PbiPassword 空值 主用户的密码,请参阅 Power BI 用户名和密码
ClientSecret Azure AD 客户端机密 空值
WorkspaceId 包含嵌入报表的工作区的 ID,请参阅工作区 ID 包含嵌入报表的工作区的 ID,请参阅工作区 ID
ReportId 要嵌入的报表的 ID,请参阅报表 ID 要嵌入的报表的 ID,请参阅报表 ID

4、服务主体嵌入模式

4.1、Node.JS 程序测试

1、进行目录,运行如下命令:

npm install
​

2、使用Vscode 打开代码,修改config.json

{## 认证方式为服务主体"authenticationMode": "serviceprincipal",## 认证的URLhttps://login.chinacloudapi.cn/为基础URL,后面需要加上域名,如这里的测试域名*****.partner.onmschina.cn"authorityUri": "https://login.chinacloudapi.cn/****.partner.onmschina.cn",  ##21v的scope"scope": "https://analysis.chinacloudapi.cn/powerbi/api",##apiurl"apiUrl": "https://api.powerbi.cn/",## 注册的APPID"clientId": "281c6e6d-7743-42d4-bXXXXXXXXXXXXXXXXX",## 工作区ID"workspaceId": "d8f05357-df5d-464cXXXXXXXXXXXXXXXXX",## 报表ID"reportId": "f2f783c3-a9c9-4baaXXXXXXXXXXXXXXXXX",//为空"pbiUsername": "",//为空"pbiPassword": "",#APP密钥"clientSecret": "*****************************",//租户ID"tenantId": "90118320-a2c2-XXXXXXXXXXXXXXXXX"
}
​

3、修改embedConfigService.js

将这个页面中的 powerbi.com替换为 powerbi.cn

4、修改JS SDK

找到目录下文件:
node_modules\powerbi-client\dist\powerbi.min.js

打开文件,替换powerbi.com 为 powerbi.cn

5、进入目录

运行
npm start 

正常情况就可以看到嵌入结果

4.2、使用.NET Framework程序

.1、.NET Framework相对简单,打开工程修改配置

找到 web.config<add key="authenticationType" value="serviceprincipal" /><!-- Common configuration properties for both authentication types -->//appid 注册应用<add key="applicationId" value="281c6e6d-7743-******" />//工作区id<add key="workspaceId" value="d8f05357-df5d-******"2" />//报表id<add key="reportId" value="f2f783c3-a9c9--******"" />
​<!-- Fill Tenant ID in authorityUrl-->//认证地址,<add key="authorityUrl" value="https://login.chinacloudapi.cn/organizations/" />//scope地址<add key="scope" value="https://analysis.chinacloudapi.cn/powerbi/api/.default" />//api地址<add key="urlPowerBiServiceApiRoot" value="https://api.powerbi.cn/" />//用户名密钥留空<!-- Note: Do NOT leave your credentials on code. Save them in secure place like Key Vault. --><add key="pbiUsername" value="" /><add key="pbiPassword" value="" />
​<!-- Note: Do NOT leave your app secret on code. Save it in secure place like Key Vault. -->///app密钥<add key="applicationSecret" value="oar+n6K81*******0=" />//租户id<add key="tenant" value="90118320-a2c2-437b-*********" />

2、修改运行端口号为5300,如果不能改为5300,则需要将3.1注册的 应用程序的

主页url改为相同

3、按f5即可运行,成功可以看到集成的页面:

5、主用户嵌入模式

5.1、基础准备

1、使用主用户嵌入模式,首先需要准备一个powerbi user,需要这个账户的id和密钥,作为配置参数,

此账户具备powerbi嵌入工作区的权限。

2、配置 注册的应用,Azure portal 选择应用注册,点击注册的应用,选择:身份验证,允许公共客户端流

其他配置使用3、环境部署的配置

5.2、Node.JS 程序测试

1、进行目录,运行如下命令:

npm install
​

2、使用Vscode 打开代码,修改config.json

{## 认证方式为主用户模式"authenticationMode": "masteruser",## 认证的URLhttps://login.chinacloudapi.cn/为基础URL,后面需要加上域名,如这里的测试域名*****.partner.onmschina.cn"authorityUri": "https://login.chinacloudapi.cn/****.partner.onmschina.cn",  ##21v的scope"scope": "https://analysis.chinacloudapi.cn/powerbi/api",##apiurl"apiUrl": "https://api.powerbi.cn/",## 注册的APPID"clientId": "281c6e6d-7743-42d4-bXXXXXXXXXXXXXXXXX",## 工作区ID"workspaceId": "d8f05357-df5d-464cXXXXXXXXXXXXXXXXX",## 报表ID"reportId": "f2f783c3-a9c9-4baaXXXXXXXXXXXXXXXXX",//为空*******.partner.onmschina.cn"pbiUsername": "xxx@****.partner.onmschina.cn",//为空"pbiPassword": "******",#APP密钥为空"clientSecret": ""//租户ID为空"tenantId": ""
}
​

3、修改embedConfigService.js

将这个页面中的 powerbi.com替换为 powerbi.cn

4、修改JS SDK

找到目录下文件:
node_modules\powerbi-client\dist\powerbi.min.js

打开文件,替换powerbi.com 为 powerbi.cn

5、进入目录

运行
npm start 

正常情况就可以看到嵌入结果

5.3、.NET Framework程序测试

.1、NetCore相对简单,打开工程修改配置

 找到 web.config
​<add key="authenticationType" value="masteruser" /><!-- Common configuration properties for both authentication types -->//appid 注册应用<add key="applicationId" value="281c6e6d-7743-******" />//工作区id<add key="workspaceId" value="d8f05357-df5d-******"2" />//报表id<add key="reportId" value="f2f783c3-a9c9--******"" />
​<!-- Fill Tenant ID in authorityUrl-->//认证地址,<add key="authorityUrl" value="https://login.chinacloudapi.cn/organizations/" />//scope地址<add key="scope" value="https://analysis.chinacloudapi.cn/powerbi/api/.default" />//api地址<add key="urlPowerBiServiceApiRoot" value="https://api.powerbi.cn/" />//用户名密钥<!-- Note: Do NOT leave your credentials on code. Save them in secure place like Key Vault. --><add key="pbiUsername" value="xxx@*****.partner.onmschina.cn" /><add key="pbiPassword" value="****" />
​<!-- Note: Do NOT leave your app secret on code. Save it in secure place like Key Vault. -->///app密钥为空<add key="applicationSecret" value="" />//租户id为空<add key="tenant" value="" /> 

2、修改运行端口号为5300,如果不能改为5300,则需要将3.1注册的 应用程序的

主页url改为相同

3、按f5即可运行,成功可以看到集成的页面。

6、行级安全性

嵌入式若使用行级安全性,需要在报表中设置用户、角色和规则,逻辑就是用户访问进来可以通过username函数拿到用户,进行匹配就可以进行行级安全管控

在集成方案里面也是可以做到的。需要进行传参。

nodejs代码,找到embedConfigService.js代码

​
找到
async function getEmbedTokenForSingleReportSingleWorkspace(reportId, datasetIds, targetWorkspaceId)
过程
​
添加代码formData["identities"]=[{"username": "max", //需要传入的用户名"roles": ["roleA","roleB"  //角色],"datasets": ["d0a960a9-6705-4936-80ed-0de24fe13031"  ///数据集ID ,如需多个则传入多个id]}];完整代码如下: async function getEmbedTokenForSingleReportSingleWorkspace(reportId, datasetIds, targetWorkspaceId) {
​// Add report id in the requestlet formData = {'reports': [{'id': reportId}]};
​// Add dataset ids in the requestformData['datasets'] = [];for (const datasetId of datasetIds) {formData['datasets'].push({'id': datasetId})}
​// Add targetWorkspace id in the requestif (targetWorkspaceId) {formData['targetWorkspaces'] = [];formData['targetWorkspaces'].push({'id': targetWorkspaceId})};formData["identities"]=[{"username": "max","roles": ["roleA","roleB"],"datasets": ["d0a960a9-6705-4936-80ed-0de24fe13031"]}];// console.log(formData);// console.log(formData["identities"]);const embedTokenApi = "https://api.powerbi.cn/v1.0/myorg/GenerateToken";const headers = await getRequestHeader();//console.log(headers);// Generate Embed token for single report, workspace, and multiple datasets. Refer https://aka.ms/MultiResourceEmbedTokenconst result = await fetch(embedTokenApi, {method: 'POST',headers: headers,body: JSON.stringify(formData)});// console.log(headers);if (!result.ok)throw result;return result.json();
}
​

传输后用username获得用户名可以如下,正是传入的max

..NET Framework 代码可修改如下:

EmbedService.cs  GetEmbedToken内添加:
​identities: new List<EffectiveIdentity> { new EffectiveIdentity(username: "max", roles: new List<string> { "roleA", "roleB" }, datasets: new List<string> { "d0a960a9-6705-4936-80ed-0de24fe13031" }) } 完整代码为:public static async Task<EmbedToken> GetEmbedToken(Guid reportId, IList<Guid> datasetIds, [Optional] Guid targetWorkspaceId){using (var pbiClient = await GetPowerBiClient()){// Create a request for getting Embed token // This method works only with new Power BI V2 workspace experiencevar tokenRequest = new GenerateTokenRequestV2(
​reports: new List<GenerateTokenRequestV2Report>() { new GenerateTokenRequestV2Report(reportId) },
​datasets: datasetIds.Select(datasetId => new GenerateTokenRequestV2Dataset(datasetId.ToString())).ToList(),targetWorkspaces: targetWorkspaceId != Guid.Empty ? new List<GenerateTokenRequestV2TargetWorkspace>() { new GenerateTokenRequestV2TargetWorkspace(targetWorkspaceId) } : null,//添加RLSidentities: new List<EffectiveIdentity> { new EffectiveIdentity(username: "max", roles: new List<string> { "roleA", "roleB" }, datasets: new List<string> { "d0a960a9-6705-4936-80ed-0de24fe13031" }) }
​
​);​// Generate Embed tokenvar embedToken = pbiClient.EmbedToken.GenerateToken(tokenRequest);
​return embedToken;}}
​
​

Power BI Embedded 开发国内版-21V-版本实测相关推荐

  1. Power BI许可证差异(免费、Pro、PPU、Embedded、Premium)

    不可否认,在商业BI软件中Power BI是最强大的,在2023年的Gartner的魔力象限中Power BI又是第一名Microsoft named a Leader in the 2023 Gar ...

  2. 每个Power BI开发人员的Power Query提示

    If someone asks you to define the Power Query, what should you say? If you've ever worked with Power ...

  3. 微软发布 Power BI 2020 上半年发行计划

    微软官方与日前发布了 Power BI 在2020上半年的发行计划.本文将在 2020.9 之前都有用,建议收藏查看.从今年开始,我们除了客观描述 Power BI 的特性外,还将加入大量主观观点态度 ...

  4. Tableau 与 Power BI的比较

    先来看一张图,这张图显示了从2011年到2020年Tableau .Power BI .帆软 .Cognos 这4个关键词在度娘中被检索得次数的变化.可以看到tableau得检索率还是蛮高的,从一定程 ...

  5. power bi报表服务器_如何将Power BI Report Server报表嵌入ASP.Net Web应用程序

    power bi报表服务器 Every once in a while, teams from different functional areas of the business (i.e. bus ...

  6. Power BI /Power BI Pro账户等基本概念介绍

    视频内容: Power BI 的基本概念 Power BI 的概念: Power BI 是一种商业分析解决方案,可帮助对数据进行可视化.共享可视化报表.或将报表嵌入应用或网站中. Microsoft ...

  7. power bi 创建空表_如何使用R在Power BI中创建地理地图

    power bi 创建空表 介绍 (Introduction) This is the fifth article of a series dedicated to discovering geogr ...

  8. 为什么玩转Power BI一定需要Office 365

    为什么玩转 Power BI 一定需要 Office 365? BI工具数不胜数,Power BI.Tableau.FineBI.永洪BI.百度智能云等,甚至 python.MATLAB 都可以实现报 ...

  9. Power BI 自定义门户----大成

    Power BI 协作门户大成 Power BI 是什么不用介绍了, Power BI 是软件服务.应用和连接器的集合,它们协同工作以将相关数据来源转换为连贯的视觉逼真的交互式见解. 数据可以是 Ex ...

最新文章

  1. 暑假想打比赛,小白怎么从0入门?
  2. 【跃迁之路】【707天】程序员高效学习方法论探索系列(实验阶段464-2019.1.28)...
  3. 涉密计算机网络与互联网及其,涉密计算机及网络与互联网及其他公共信息网络必须隔离 - 作业在线问答...
  4. boost::random模块使用多精度类型测试所有与整数相关的生成器和分布的测试程序
  5. carsim输出端口2的宽度无效_PIO CORE 解析 (2)
  6. java判断有没有修改,java字节码判断对象应用是否被修改
  7. 本地gradle使用
  8. 在Python中写入文件时,权限被拒绝错误
  9. java正向最大匹配算法_java中文分词之正向最大匹配法实例代码
  10. spring(12)
  11. ctx->cvdl->cuvidGetDecoderCaps(ctx->caps8) failed -> CUDA_ERROR_DEINITIALIZED: driver shutting down
  12. 三菱GXWorks2 绘制梯形图
  13. 计算机硬盘被配置成动态磁盘,动态硬盘
  14. C++ Object Persistence with ODB 学习笔记
  15. 高盛vr/ar研究报告
  16. 线程,Java8,10个lambda表达式
  17. h5前端IE浏览器低版本判断及升级提示
  18. 【C语言】你还不会指针吗?不妨来一起攻克指针这个难点
  19. Invalid bound statement (not found) 终极解决办法
  20. 计算机python教程_Python 如何入门?附Python教程下载

热门文章

  1. Paw —— 比Postman更舒服的API利器
  2. jQuery检查某个元素在页面上是否存在
  3. DirectUpdateHandler2 Solr commit
  4. speedbutton用法
  5. Android嵌入式安卓触摸屏|4418开发板平台
  6. 关于C#的强制转换和尝试转换的方法
  7. logback 配置详解
  8. TensorFlow 卷积神经网络实用指南 | iBooker·ApacheCN
  9. 安卓应用安全指南 4.6.3 处理文件 高级话题
  10. 数据结构思维 第十二章 `TreeMap`