适用范围:️ 应用拥有数据 用户拥有数据
本文解释了如何在使用存储于Azure Analysis Services(AAS)中的数据的情况下,以为客户嵌入的模式嵌入 Power BI 报表。 本文旨在面向独立软件开发人员(ISV),无论数据库是否实现行级安全性(RLS),都希望将报表与 AAS 数据嵌入其中。
先决条件
需要具有与 AAS 数据库的实时连接且可以带或不带 RLS 的报表。
动态安全性 - RLS
如果希望报表实现动态 RLS,请使用函数 customeData 。 由于您无法覆盖有效标识,我们建议使用 customData 创建新的角色。 您也可以使用具有username或userPrincipalName功能的角色,如果您将它们替换为customData。
请按照以下步骤创建一个新角色并将 customData 函数添加到该角色。
在 Analysis Services 服务器中创建角色。
在 “常规 ”设置中,提供 角色名称 并将数据库权限设置为 “ 只读”。
在 成员身份 设置中,添加将调用 嵌入令牌 - 生成令牌 API 的用户。 如果您使用的是具有非管理员权限的服务主体,请同时添加该主体。
在 行筛选器 设置中,使用
CUSTOMDATA()函数设置 DAX 查询。
服务主体
如果使用服务主体嵌入报表,请确保服务主体是 AAS 的服务器管理员或角色成员。 若要向服务主体授予 AAS 管理员权限,请参阅 向服务器管理员角色添加服务主体。 若要将服务主体添加为角色成员,请转到 “成员身份 ”设置。
使用 服务主体对象 ID 作为用户名(有效标识)。
Analysis Service 的迁移
即使有嵌入的 AAS 报表,也可以 从 AAS 迁移到 Power BI Premium 。 只要调用 嵌入令牌 - 生成令牌 API 的主体是工作区的成员或管理员,嵌入报表在迁移期间不会中断。
注释
如果服务主体不是管理员,并且你不希望在迁移时使其成为工作区的管理员,请将该模型迁移到单独的工作区中,可在其中授予管理员权限。
生成嵌入令牌
生成嵌入令牌所需的信息取决于连接到 Power BI(服务主体 或 主用户)的方式,以及数据库是否具有 RLS。
若要生成嵌入令牌,请提供以下信息:
- 用户名 (可选(如果没有 RLS)。RLS 必需) - 用户名必须与 API 调用方相同(在本例中为 Master 用户的 UPN)。 如果数据库不使用 RLS,并且未提供用户名,则使用主用户的凭据。
- 角色 (RLS 必需) - 仅当有效身份属于该角色时,报表才会显示数据。
示例:
为以下三种方案之一定义用户标识和角色:
- 如果未实现 RLS:
无需定义任何有效的标识。
如果使用静态 RLS:
var rlsidentity = new EffectiveIdentity( //If static RLS username: "username@contoso.com", roles: new List<string>{ "MyRole" }, datasets: new List<string>{ datasetId.ToString()} )如果使用动态 RLS:
var rlsidentity = new EffectiveIdentity( // If dynamic RLS username: "username@contoso.com", roles: new List<string>{ "MyRoleWithCustomData" }, customData: "SalesPersonA" datasets: new List<string>{ datasetId.ToString()} )注释
customData嵌入令牌中的字符不能大于 1,024 个字符。
使用有效身份生成嵌入令牌:
public EmbedToken GetEmbedToken(Guid reportId, IList<Guid> datasetIds, [Optional] Guid targetWorkspaceId)
{
PowerBIClient pbiClient = this.GetPowerBIClient();
// Create a request for getting an embed token for the rls identity defined above
var 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,
identities: new List<EffectiveIdentity> { rlsIdentity } // Only in cases of RLS
);
// Generate an embed token
var embedToken = pbiClient.EmbedToken.GenerateToken(tokenRequest);
return embedToken;
}
使用嵌入令牌将报表嵌入应用或网站。 报表根据报表中应用的 RLS 筛选数据。