使用 Azure Analysis Services (AAS) 数据库嵌入报表

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

本文解释了如何在使用存储于Azure Analysis Services(AAS)中的数据的情况下,以为客户嵌入的模式嵌入 Power BI 报表。 本文旨在面向独立软件开发人员(ISV),无论数据库是否实现行级安全性(RLS),都希望将报表与 AAS 数据嵌入其中。

先决条件

需要具有与 AAS 数据库的实时连接且可以带或不带 RLS 的报表。

动态安全性 - RLS

如果希望报表实现动态 RLS,请使用函数 customeData 。 由于您无法覆盖有效标识,我们建议使用 customData 创建新的角色。 您也可以使用具有usernameuserPrincipalName功能的角色,如果您将它们替换为customData

请按照以下步骤创建一个新角色并将 customData 函数添加到该角色。

  1. 在 Analysis Services 服务器中创建角色。

    在 Analysis Services 服务器中创建新角色的屏幕截图。

  2. “常规 ”设置中,提供 角色名称 并将数据库权限设置为 只读”。

    在 Analysis Services 服务器的常规设置中,为新角色提供新名称并将其设置为只读的屏幕截图。

  1. 成员身份 设置中,添加将调用 嵌入令牌 - 生成令牌 API 的用户。 如果您使用的是具有非管理员权限的服务主体,请同时添加该主体。

    在 Analysis Services 服务器中将用户添加到新角色的屏幕截图。

  2. 行筛选器 设置中,使用 CUSTOMDATA() 函数设置 DAX 查询。

    显示如何在 Analysis Services 服务器的新角色中将函数 customData 添加到 DAX 查询的屏幕截图。

服务主体

如果使用服务主体嵌入报表,请确保服务主体是 AAS 的服务器管理员或角色成员。 若要向服务主体授予 AAS 管理员权限,请参阅 向服务器管理员角色添加服务主体。 若要将服务主体添加为角色成员,请转到 “成员身份 ”设置

使用 服务主体对象 ID 作为用户名(有效标识)。

Analysis Service 的迁移

即使有嵌入的 AAS 报表,也可以 从 AAS 迁移到 Power BI Premium 。 只要调用 嵌入令牌 - 生成令牌 API 的主体是工作区的成员或管理员,嵌入报表在迁移期间不会中断。

注释

如果服务主体不是管理员,并且你不希望在迁移时使其成为工作区的管理员,请将该模型迁移到单独的工作区中,可在其中授予管理员权限。

生成嵌入令牌

使用 生成令牌 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 筛选数据。