Hi,
I am trying to use PowerBi Embeded in our application for our customers, however I get the following:
> Json Object
{
"message": "LoadReportFailed",
"detailedMessage": "Fail to initialize - Could not resolve cluster",
"errorCode": "403",
"level": 6,
"technicalDetails": {
"requestId": "5ccfb85d-9a69-49b4-b80f-1706f36bd590"
}
}
What am I doing?
This is my app settings:
"AppSettings": { "AuthorityUri": "https://login.windows.net/common/oauth2/authorize/", "ResourceUrl": "https://analysis.windows.net/powerbi/api", "RedirectUrl": "http://localhost:21638", "ApiUrl": "https://api.powerbi.com/", "ApplicationId": "MYAPPLICATIONID", "LoggingRequestUrl": "https://login.microsoftonline.com/common/oauth2/token", "GroupId": "MY WORKSPACE ID", "ReportID": "MY REPORTID", "ApplicationSecret": "MY APP SECRET", "Username": "POWERBI PRO USER ACCOUNT EMAIL", "Password": "MY PASSWORD" }
I get the Token using:
var authorityUrl = $"https://login.microsoftonline.com/GROUPACCOUNTURL/oauth2/token"; var oauthEndpoint = new Uri(authorityUrl); using (var client = new HttpClient()) { var result = await client.PostAsync(oauthEndpoint, new FormUrlEncodedContent(new[] { new KeyValuePair<string, string>("resource", AppSettings.ResourceUrl), new KeyValuePair<string, string>("client_id", AppSettings.ApplicationId), new KeyValuePair<string, string>("client_secret", AppSettings.ApplicationSecret), new KeyValuePair<string, string>("grant_type", "password"), new KeyValuePair<string, string>("username", AppSettings.Username), new KeyValuePair<string, string>("password",AppSettings.Password), new KeyValuePair<string, string>("scope", "openid"), })); var content = await result.Content.ReadAsStringAsync(); var authenticationResult = JsonConvert.DeserializeObject<OAuthResult>(content); return (new TokenCredentials(authenticationResult.AccessToken, "Bearer"), authenticationResult.AccessToken);
I then do the following:
using (var powerBiClient = new PowerBIClient(new Uri(AppSettings.ApiUrl), credential.tokenCredentials)) { var powerBiReport = powerBiClient.Reports.GetReportInGroup(AppSettings.GroupId, reportId); if (powerBiReport != null) { var rowLevelSecurityIdentity = new List<EffectiveIdentity> { new EffectiveIdentity(name, roles: new List<string> {role}, datasets: new List<string> {powerBiReport.DatasetId}) }; var powerBiTokenRequestParameters = new GenerateTokenRequest("view", powerBiReport.DatasetId, identities: rowLevelSecurityIdentity); var powerBiTokenResponse = powerBiClient.Reports.GenerateTokenInGroup(AppSettings.GroupId,powerBiReport.Id, powerBiTokenRequestParameters); powerBIModel.EmbedUrl = powerBiReport.EmbedUrl; powerBIModel.ReportId = powerBiReport.Id; powerBIModel.AccessToken = powerBiTokenResponse.Token; }
Can anyone help please?
Thanks
LoadReportFailed | Fail to initialize - Couldn't resolve cluster | 403 | * Bad access token * Embed type doesn't match token type |
As per https://docs.microsoft.com/en-us/power-bi/developer/embedded-troubleshoot.
My code is pretty similar and it works:
public async Task<AzureToken> GetAzureTokenDataAsync() { string authorityUrl = $"{_azureSettings.Instance}{_azureSettings.TenantId}/oauth2/token"; Uri oauthEndpoint = new Uri(authorityUrl); using (HttpClient httpClient = new HttpClient()) { HttpResponseMessage responseMessage = await httpClient.PostAsync(oauthEndpoint, new FormUrlEncodedContent(new[] { new KeyValuePair<string, string>("resource", _powerBiSettings.ResourceUrl), new KeyValuePair<string, string>("client_id", _azureSettings.ClientId), new KeyValuePair<string, string>("grant_type", "password"), new KeyValuePair<string, string>("username", _powerBiSettings.Username), new KeyValuePair<string, string>("password", _powerBiSettings.Password), new KeyValuePair<string, string>("scope", "openid"), })); string responseText = await responseMessage.Content.ReadAsStringAsync(); OAuthResult authenticationResult = JsonConvert.DeserializeObject<OAuthResult>(responseText); TokenCredentials tokenCredentials = new TokenCredentials(authenticationResult.AccessToken, "Bearer"); return new AzureToken(tokenCredentials, authenticationResult.AccessToken); } } private class OAuthResult { [JsonProperty("token_type")] public string TokenType { get; set; } [JsonProperty("scope")] public string Scope { get; set; } [JsonProperty("expires_in")] public int ExpiresIn { get; set; } [JsonProperty("ext_expires_in")] public int ExtExpiresIn { get; set; } [JsonProperty("expires_on")] public int ExpiresOn { get; set; } [JsonProperty("not_before")] public int NotBefore { get; set; } [JsonProperty("resource")] public Uri Resource { get; set; } [JsonProperty("access_token")] public string AccessToken { get; set; } [JsonProperty("refresh_token")] public string RefreshToken { get; set; } } public async Task<EmbeddedReportConfig> GetReportForIdAsync(Guid reportId, string name, string roles) { var result = new EmbeddedReportConfig(); 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()); List<EffectiveIdentity> rowLevelSecurityIdentity = new List<EffectiveIdentity> { new EffectiveIdentity( name, //roles: new List<string> { role }, datasets: new List<string> {powerBiReport.DatasetId} ) }; GenerateTokenRequest powerBiTokenRequestParameters = new GenerateTokenRequest("View", powerBiReport.DatasetId, false, rowLevelSecurityIdentity); EmbedToken powerBiTokenResponse = await powerBiClient.Reports.GenerateTokenInGroupAsync(_powerBiSettings.WorkspaceId, powerBiReport.Id, powerBiTokenRequestParameters); return new EmbeddedReportConfig { Id = 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; } }
There is also this https://stackoverflow.com/a/52998483/5209435. I hope this helps.
User | Count |
---|---|
5 | |
2 | |
2 | |
1 | |
1 |
User | Count |
---|---|
9 | |
5 | |
3 | |
2 | |
2 |