PowerBI Embedded(应用拥有数据)创建具有有效身份的嵌入令牌失败

时间:2019-03-20 05:38:56

标签: asp.net-core azure-active-directory ssas powerbi-embedded

我收到的错误消息是:

Creating embed token for accessing dataset <my-data-set-guid> requries effective identity username to be identical to the caller's principal name.

我正在使用具有主帐户(而不是服务主体)的.NET Core 2.2 Web App内的PowerBI Embedded。幕后是Azure Active Directory和带有Live Connection的Azure Analysis Services。我正在尝试根据当前登录的用户传递有效的身份,以便使用其权限来加载报告。

我的代码如下:

// In Razor Page Get method
ClaimsPrincipal user = _httpContextAccessor.HttpContext.User;
List<Claim> claims = user.Claims.ToList();
string name = claims.FirstOrDefault(c => c.Type == "name")?.Value;
string preferredName = claims.FirstOrDefault(c => c.Type == "preferred_username")?.Value;
string roles = claims.FirstOrDefault(c => c.Type == ClaimTypes.Role)?.Value;
string upn = claims.FirstOrDefault(c => c.Type == ClaimTypes.Upn)?.Value;

var SelectedReport = await _reportRepository.GetReportForIdAsync(reportId.Value, upn, roles);

// In Repository
public async Task<EmbeddedReportConfig> GetReportForIdAsync(Guid reportId, string name, string roles)
{
    try
    {
        AzureToken azureToken = await _authenticationHandler.GetAzureTokenDataAsync();

        using (PowerBIClient powerBiClient = new PowerBIClient(new Uri(_powerBiSettings.ApiUrl), azureToken.TokenCredentials))
        {
            Report powerBiReport = await powerBiClient.Reports.GetReportAsync(_powerBiSettings.WorkspaceId, reportId.ToString());

            var rolesList = new List<string>();

            if (!string.IsNullOrWhiteSpace(roles))
            {
                rolesList.AddRange(roles.Split(','));
            }

            List<EffectiveIdentity> rowLevelSecurityIdentity = new List<EffectiveIdentity>
            {
                new EffectiveIdentity(
                    name,
                    roles: rolesList,
                    datasets: new List<string> {powerBiReport.DatasetId}
                )
            };
            GenerateTokenRequest powerBiTokenRequestParameters = new GenerateTokenRequest("View", null, identities: rowLevelSecurityIdentity);

            EmbedToken powerBiTokenResponse = await powerBiClient.Reports.GenerateTokenInGroupAsync(_powerBiSettings.WorkspaceId, powerBiReport.Id, powerBiTokenRequestParameters);

            return new EmbeddedReportConfig
            {
                ReportId = Guid.Parse(powerBiReport.Id),
                Name = powerBiReport.Name,
                EmbedUrl = powerBiReport.EmbedUrl,
                AccessToken = powerBiTokenResponse.Token
            };
        }
    }
    catch (HttpOperationException ex)
    {
        // https://community.powerbi.com/t5/Developer/quot-shouldn-t-have-effective-identity-quot-error-when-passing/td-p/433730
        // https://docs.microsoft.com/en-us/power-bi/developer/embedded-row-level-security
        //Bad Request
        var content = ex.Response.Content;
        Console.WriteLine(content);
    }

    return null;
}

如您所见,我输入了用户的UPN作为有效身份名称。如果我以主用户身份登录(用于嵌入),那么对令牌的请求将成功,但是如果我使用属于同一AAD租户的任何其他帐户,则它将失败,并出现上面的错误消息。

我看到其他人在here之前遇到了此问题。使用此处提到的CustomData功能将无法正常工作,因为并非所有数据表都使用UPN进行了标记,Azure Analysis Services中设置了单独的角色。

我注意到有人提到添加UPN映射(link1link2),但是我不确定是否可以使用它,因为BI Analyst在Azure门户内部而不是在内部设置了数据网关。 PowerBI门户。

我尝试使用示例App Owns Data application,但遇到了同样的问题。

1 个答案:

答案 0 :(得分:0)

我意识到这个问题现在已经很老了,但这也许会对某人有所帮助。

您需要根据this articleEffectiveIdentity username属性设置为服务主体对象ID