Я получаю сообщение об ошибке:
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.
Я попытался использовать пример Приложение с данными приложения , но столкнулся с той же проблемой.