saj*_*fan 3 powerbi powerbi-embedded powerbi-desktop
我已经嵌入了 powerbi 报告,该报告在我更改数据库之前一直运行良好。
我观察到 datasets.IsEffectiveIdentityRequired(在下面的代码中)之前是假的,现在是真的,我收到一个错误 - {"error":{"code":"InvalidRequest","message":"Creating embed token for访问数据集 02c90e15-35dd-4036-a525-4f5d158bfade 需要在提供的有效身份中包含角色"}}
我正在使用标准的嵌入服务代码。
// 创建 Power BI 客户端对象。它将用于调用 Power BI API。
using (var client = new PowerBIClient(new Uri(ApiUrl), m_tokenCredentials))
{
// Get a list of reports.
var reports = await client.Reports.GetReportsInGroupAsync(WorkspaceId);
Report report = reports.Value.FirstOrDefault(r => r.Id.Equals(ReportId, StringComparison.InvariantCultureIgnoreCase));
var datasets = await client.Datasets.GetDatasetByIdInGroupAsync(WorkspaceId, report.DatasetId);
m_embedConfig.IsEffectiveIdentityRequired = datasets.IsEffectiveIdentityRequired;
m_embedConfig.IsEffectiveIdentityRolesRequired = datasets.IsEffectiveIdentityRolesRequired;
GenerateTokenRequest generateTokenRequestParameters;
// This is how you create embed token with effective identities
// HERE username IS NULL
if (!string.IsNullOrWhiteSpace(username))
{
var rls = new EffectiveIdentity(username, new List<string> { report.DatasetId });
if (!string.IsNullOrWhiteSpace(roles))
{
var rolesList = new List<string>();
rolesList.AddRange(roles.Split(','));
rls.Roles = rolesList;
}
// Generate Embed Token with effective identities.
generateTokenRequestParameters = new GenerateTokenRequest(accessLevel: "view", identities: new List<EffectiveIdentity> { rls });
}
else
{
// Generate Embed Token for reports without effective identities.
generateTokenRequestParameters = new GenerateTokenRequest(accessLevel: "view");
}
var tokenResponse = await client.Reports.GenerateTokenInGroupAsync(WorkspaceId, report.Id, generateTokenRequestParameters);
Run Code Online (Sandbox Code Playgroud)
}
首先,我完全理解发生此错误是因为我没有传递任何身份。那么,是否有任何选项可以禁用 IsEffectiveIdentityRequired?
二、powerbi中如何设置用户和角色?--我不是 PowerBI 专家--
IsEffectiveIdentityRequired是只读属性,因此您无法控制它,也没有禁用它的选项。
根据您连接到有效身份的数据源,可能需要也可能不需要。
如果 IsEffectiveIdentityRequired 为 true,则在调用 GenerateTokenRequest 以生成嵌入令牌时需要传递 EffectiveIdentity。如果数据源需要一个有效的身份而您没有传递一个,您将在调用 GenerateTokenRequest 时收到错误消息。如果您传递不完整的 EffectiveIdentity,例如在调用 GenerateTokenRequest 时缺少角色的有效身份,您也会收到错误消息。
下面是一个示例,说明如何使用 IsEffectiveIdentityRequired 属性生成带有或不带有有效标识的嵌入令牌,具体取决于数据源是否需要它。
List<EffectiveIdentity> eil = new List<EffectiveIdentity>();
EffectiveIdentity ef = new EffectiveIdentity();
// UserName
ef.Username = FullADUsername;
// Roles
List<string> Roles = new List<string>();
ef.Roles = Roles;
// Datasets
List<string> _Datasets = new List<string>();
_Datasets.Add(report.DatasetId);
ef.Datasets = _Datasets;
eil.Add(ef);
// Look up the data set of the report and look if we need to pass an Effective Identify
Dataset d = client.Datasets.GetDatasetByIdInGroup(WorkspaceId, report.DatasetId);
if (d.IsEffectiveIdentityRequired == true)
{
GenerateTokenRequest gtr = new GenerateTokenRequest("View", null, false, eil);
newEmbedToken = client.Reports.GenerateTokenInGroup(WorkspaceId, ReportId, gtr);
}
else
{
GenerateTokenRequest gtr = new GenerateTokenRequest();
newEmbedToken = client.Reports.GenerateTokenInGroup(WorkspaceId, ReportId, gtr);
}
Run Code Online (Sandbox Code Playgroud)