由于缺少有效身份中的角色,无法生成用于访问数据集的嵌入令牌

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 专家--

vvv*_*v4d 5

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)