Forum Discussion
Wahidm
7 years agoRegular Visitor
Embed for customers- Fail to initialize - Could not resolve cluster
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;
}- I have set up the resource and the dedicated capacity in Azure
- I have the diamond showing on the Workspace in PowerBi
- I am the master user and I also have a PowerBi Pro account
- It manages to get embed Url and access token but nothing shows up. I run the embed url, access token and report Id on the power bi playground site and get the error json above.
Can anyone help please?
Thanks
1 Reply
- MattStannettFrequent Visitor
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.