将报表嵌入在本地部署的 SQL Server Analysis Services (SSAS) 中

适用范围:️ 应用拥有数据 用户拥有数据

本文介绍如何将 Power BI 内容通过的<本地>实时连接嵌入到标准的 Power BI 应用管理数据的应用程序中。 本文适用于 所有 实时连接 SSAS 模型,无论它们是否实现 RLS。

在此方案中,数据库位于 SSAS(本地)模型上,Power BI 引擎通过 网关连接到它。 安全角色(RLS)和权限(如果有)在 SSAS 模型中定义, 而不是 在 Power BI Desktop 中定义。

本文面向谁

本文主要与具有本地(SSAS)数据库设置(带或不带 RLS)的 ISV 相关,并且想要直接从该处嵌入内容。

ISV 设置

本地行级别安全性仅适用于实时连接,但你可以创建与任何数据库的实时连接,无论它是否实现 RLS。 这包括:

  • 未设置 RLS 角色的数据库
  • 具有属于一个或多个角色的成员的数据库
  • 具有静态或动态安全角色的数据库

若要从 SSAS 模型嵌入报表,需要执行以下作:

  1. 设置网关
  2. 创建实时连接
  3. 生成嵌入令牌

设置网关

将数据源连接添加到 SSAS 网关

输入 Active Directory 识别的数据源名称、数据源类型、服务器、数据库、用户名和密码。

有关创建和管理网关的详细信息,请参阅 添加或删除网关数据源

在网关上为服务主体或主用户授予权限

生成嵌入令牌的用户还需要以下权限 之一

  • 网关管理员权限

  • 数据源模拟权限(ReadOverrideEffectiveIdentity)

    具有模拟(覆盖)权限的用户在其姓名旁边有一个钥匙图标。

    网关成员的屏幕截图,其中包含其名称旁边的密钥图标。

按照以下说明向主要用户、服务主体或服务主体配置文件授予网关访问权限。

执行以下操作之一:

映射用户名

如果本地目录和 Microsoft Entra 目录上的用户名不同,并且想要在门户中查看数据,则需要创建一个用户映射表,用于将每个用户或角色映射到Microsoft Entra ID 中的用户,并将其映射到本地数据库中的用户。 有关映射用户名的说明,请转到 手动重新映射用户名

有关详细信息,请参阅 为分析服务数据源映射用户名

创建实时连接

设置环境后,在 Power BI Desktop 和 SQL Server 之间创建 实时连接 并创建报表。

  1. 启动 Power BI Desktop 并选择“ 获取数据>数据库”。

  2. 从数据源列表中,选择 SQL Server Analysis Services 数据库 ,然后选择 “连接”。

    连接到 SQL Server Analysis Services 数据库。

  3. 填写 Analysis Services 表格实例详细信息,然后选择 “实时连接”。 然后选择“ 确定”。

    Analysis Services 详细信息的屏幕截图。

生成嵌入令牌

若要在“为客户嵌入”场景中嵌入报表,请生成一个将有效标识传递给 Power BI 的嵌入令牌。 与 AS 引擎的所有实时连接都需要有效的标识,即使没有实现 RLS。

如果没有设置 RLS,则只有管理员有权访问数据库,因此你想要使用管理员作为有效标识。

生成嵌入令牌所需的信息取决于你是否使用服务主体或主用户连接到 Power BI,以及数据库是否具有 RLS。

若要生成嵌入令牌,请提供以下信息:

  • 用户名(如果没有 RLS,可选;如果需要 RLS,则必填)- 由 SSAS 识别并用作有效标识的用户名。 如果数据库不使用 RLS,并且未提供用户名,则使用主用户的凭据。
  • 角色 (RLS 必需) - 报表仅在有效标识属于角色成员时才显示数据。

示例:

public EmbedToken GetEmbedToken(Guid reportId, IList<Guid> datasetIds, [Optional] Guid targetWorkspaceId)
{
    PowerBIClient pbiClient = this.GetPowerBIClient();

    // Define the user identity and roles. Use one of the following:

    var rlsidentity = new EffectiveIdentity(  //If no RLS
       username: "Domain\\Username", // can also be username@contoso.com
       datasets: new List<string>{ datasetId.ToString()}
    )

    var rlsidentity = new EffectiveIdentity(  // If RLS
       username: "username@contoso.com",
       roles: new List<string>{ "MyRole" },
       datasets: new List<string>{ datasetId.ToString()}
    )
    
    // 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 }
    );

    // Generate an embed token
    var embedToken = pbiClient.EmbedToken.GenerateToken(tokenRequest);

    return embedToken;
}

现在可以在应用中嵌入报表,报表将根据访问报表的用户的权限筛选数据。

注意事项和限制

不支持 CustomData。

生成嵌入令牌