Forum Discussion
PowerBI Rest API C# throwing 'Operation returned an invalid status code 'Unauthorized''
Hey all,
I've been following some tutorials and am trying to access some reports from our Power BI instance. I can successfully authenticate and get a Bearer Auth token, but when using my PowerBIClient to try to communicate I get an Unauthorized error.
Can someone tell me if what I am doing is wrong?
Any help to point me in the right direction would be awesome, thank you!
public async Task<string> GetToken()
{
//The client id that Azure AD created when you registered your client app.
try
{
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
List<string> scopes = new List<string>();
scopes.Add("https://analysis.windows.net/powerbi/api/.default");
var confidentialClient = ConfidentialClientApplicationBuilder
.Create("{my app ID from Azure"")
.WithClientSecret("{my client secret from azure}")
.WithAuthority(new Uri("https://login.microsoftonline.com/{my azure tenant ID}"))
.WithRedirectUri("https://localhost:44300/")
.Build();
var accessTokenRequest = confidentialClient.AcquireTokenForClient(scopes);
var authResult = await accessTokenRequest.ExecuteAsync();
return authResult.AccessToken;
}
catch
{
throw;
}
} private async Task Authenticate()
{
if (_currentAccessToken == null)
{
var tokenCredentials = new TokenCredentials(await GetToken(), "Bearer");
client = new PowerBIClient(new Uri("https://api.powerbi.com/"), tokenCredentials);
_currentAccessToken = tokenCredentials;
}
}
public async Task<string> PostExportRequest(Guid reportId, Guid groupId, FileFormat format, IList<string> pageNames = null, string urlFilter = null)
{
try
{
var exportRequest = new ExportReportRequest
{
Format = format
};
if(_currentAccessToken == null)
await Authenticate();
//also fails
var groups = await client.Groups.GetGroupsAsync();
//fails with unauthorized
var export = await client.Reports.ExportToFileInGroupAsync(reportId, groupId, exportRequest);
// Save the export ID, you'll need it for polling and getting the exported file
return export.Id;
}
catch
{
throw;
}
}
3 Replies
- AntrikshSharmaCommunity Champion
var authResult = await accessTokenRequest.ExecuteAsync(); // This should be var authResult = await accessTokenRequest.ExecuteAsync().Result;Make sure that the app has access to workspaces, that's the issue I also faced, I created the application but didn't think of giving access to workspaces.
Also check if the required API Permissions are granted in Azure Appp Registrations.
- bfinnegan7675New Member
My issue was that the API Permissions needed the Tenant.ReadAll and Tenant.WriteAll permissions in Azure AD.
Antriksh - I did try to change my ExecuteAsync() call to use the .Result but it was not working because it was throwing syntax errors.
- AnonymousNot applicable
but the permission seems too high, need admin consent, is it essential, i meet the same unauthorized errror