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

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

本文介绍如何在为客户嵌入内容场景中嵌入使用存储在 Azure Analysis Services (AAS) 中的数据的 Power BI 报表。 本文面向独立软件开发人员 (ISV),他们希望嵌入含有 AAS 数据的报表,无论数据库是否实现行级安全性 (RLS)

先决条件

无论是否实现 RLS,你都将需要一个与 AAS 数据库实时连接的报表。

动态安全性 - RLS

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

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

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

    A screenshot of creating a new role in Analysis Services server.

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

    A screenshot of giving a new role a new name and setting it to read only, in the general settings in Analysis Services server.

  1. 在“成员身份”设置中,添加将调用嵌入令牌 - 生成令牌 API 的用户。 如果使用的服务主体不是管理员,也请添加该服务主体。

    A screenshot of adding users to a new role in Analysis Services server.

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

    A screenshot showing how to add the function customData to the DAX query in a new role in Analysis Services server.

服务主体

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

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

Analysis Service 迁移

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

注意

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

生成嵌入令牌

使用生成令牌 API 生成替代有效标识的嵌入令牌。

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

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

  • 用户名(如果没有 RLS,则可选。对于 RLS 是必需的)- 用户名必须与 API 调用方相同(在本例中为主用户的 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 不能超过 1024 个字符。

使用有效标识生成嵌入令牌:

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 筛选数据。

后续步骤