PowerBI Embedded (приложение владеет данными) Создание токена вставки с эффективным удостоверением завершается неудачно - PullRequest
0 голосов
/ 20 марта 2019

Я получаю сообщение об ошибке:

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

Я использую PowerBI Embedded внутри .NET Core 2.2 Web App с основной учетной записью (в отличие от принципала службы). За кулисами скрываются службы Azure Active Directory и службы аналитики Azure с подключением в реальном времени. Я пытаюсь передать эффективную идентификацию, основанную на зарегистрированном в данный момент пользователе, чтобы его разрешения использовались для загрузки отчета.

Мой код выглядит следующим образом:

// 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 пользователя для имени Effective Identity. Если я войду в систему как основной пользователь (для встраивания), тогда запрос токена будет выполнен успешно, но если я использую любую другую учетную запись, принадлежащую тому же арендатору AAD, то произойдет сбой с сообщением об ошибке выше.

Я вижу, что другие сталкивались с этой проблемой до здесь . Использование функциональности CustomData, как упомянуто здесь, не будет работать, так как не все таблицы данных помечены UPN, в Azure Analysis Services настроены отдельные роли.

Я заметил некоторые упоминания о добавлении сопоставления UPN ( link1 , link2 ), но я не уверен, что могу использовать это, потому что BI Analyst настраивает шлюз данных внутри Azure Портал, а не портал PowerBI.

Я попытался использовать пример Приложение с данными приложения , но столкнулся с той же проблемой.

...