使用 Azure Analysis Services (AAS) 数据库嵌入报表
适用范围:️ 应用拥有数据 用户拥有数据
本文介绍如何在为客户嵌入内容场景中嵌入使用存储在 Azure Analysis Services (AAS) 中的数据的 Power BI 报表。 本文面向独立软件开发人员 (ISV),他们希望嵌入含有 AAS 数据的报表,无论数据库是否实现行级安全性 (RLS)。
先决条件
无论是否实现 RLS,你都将需要一个与 AAS 数据库实时连接的报表。
动态安全性 - 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 调用方相同(在本例中为主用户的 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 筛选数据。