我收到的错误消息是:
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映射(link1,link2),但是我不确定是否可以使用它,因为BI Analyst在Azure门户内部而不是在内部设置了数据网关。 PowerBI门户。
我尝试使用示例App Owns Data application,但遇到了同样的问题。
答案 0 :(得分:0)
我意识到这个问题现在已经很老了,但这也许会对某人有所帮助。
您需要根据this article将EffectiveIdentity
username
属性设置为服务主体对象ID