The ultimate Microsoft Fabric, Power BI, Azure AI, and SQL learning event: Join us in Stockholm, September 24-27, 2024.
Save €200 with code MSCUST on top of early bird pricing!
Find everything you need to get certified on Fabric—skills challenges, live sessions, exam prep, role guidance, and more. Get started
Can you provider detail about how to fix this issues.
I used below code to get access token and i got it successfully.
protected void Page_Load(object sender, EventArgs e)
{
//Redirect uri must match the redirect_uri used when requesting Authorization code.
string redirectUri = Properties.Settings.Default.RedirectUrl;
string authorityUri = Properties.Settings.Default.AADAuthorityUri;
string resourceUri = Properties.Settings.Default.PowerBiAPI;
string clientId = Properties.Settings.Default.ClientID;
string seceretId = Properties.Settings.Default.ClientSecretKey;
// Get the auth code
string code = Request.Params.GetValues(0)[0];
TokenCache TC = new TokenCache();
AuthenticationContext _authenticationContext = new AuthenticationContext(authorityUri, TC);
ClientCredential cc = new ClientCredential(clientId, seceretId);
AuthenticationResult AR = _authenticationContext.AcquireTokenAsync(resourceUri, cc).Result;
Session["authResult"] = AR;
//Redirect back to Default.aspx
Response.Redirect("/Default.aspx");
}
But when i try to get dataset with below code ,i am getting 403 forbidden error.
protected void getDatasetsButton_Click(object sender, EventArgs e)
{
string responseContent = string.Empty;
//The resource Uri to the Power BI REST API resource
string datasetsUri = Properties.Settings.Default.PowerBiDataset;
//Configure datasets request
System.Net.WebRequest request = System.Net.WebRequest.Create(datasetsUri) as System.Net.HttpWebRequest;
request.Method = "GET";
request.ContentLength = 0;
request.Headers.Add("Authorization", String.Format("Bearer {0}", authResult.AccessToken));
//Get datasets response from request.GetResponse()
using (var response = request.GetResponse() as System.Net.HttpWebResponse)
{
//Get reader from response stream
using (var reader = new System.IO.StreamReader(response.GetResponseStream()))
{
responseContent = reader.ReadToEnd();
//Deserialize JSON string
//JavaScriptSerializer class is in System.Web.Script.Serialization
JavaScriptSerializer json = new JavaScriptSerializer();
Datasets datasets = (Datasets)json.Deserialize(responseContent, typeof(Datasets));
resultsTextbox.Text = string.Empty;
//Get each Dataset from
foreach (dataset ds in datasets.value)
{
resultsTextbox.Text += String.Format("{0}\t{1}\n", ds.Id, ds.Name);
}
}
}
}
Error Detail:'request.GetResponse()' threw an exception of type 'System.Net.WebException'
Data: {System.Collections.ListDictionaryInternal}
HResult: -2146233079
HelpLink: null
InnerException: null
Message: "The remote server returned an error: (403) Forbidden."
Response: {System.Net.HttpWebResponse}
Source: "System"
StackTrace: " at System.Net.HttpWebRequest.GetResponse()"
Status: ProtocolError
TargetSite: {System.Net.WebResponse GetResponse()}
The Token which I got:
"Bearer eyJ0eXAiOiJKV1QiLCJhb.............TH4s-2866kDfaxnGhGU64g"
Solved! Go to Solution.
I gave all permission to my app but isues was something different.I was trying to get token based on azure active directy app client id and app secerete key.After doing google i found that i need to pass credentials of azure login account too.
Below code worked for me with valide token:
private async void SetAccessToken()
{
List<KeyValuePair<string, string>> vals = new List<KeyValuePair<string, string>>();
vals.Add(new KeyValuePair<string, string>("grant_type", "password"));
vals.Add(new KeyValuePair<string, string>("scope", "openid"));
vals.Add(new KeyValuePair<string, string>("resource", "https://analysis.windows.net/powerbi/api"));
vals.Add(new KeyValuePair<string, string>("client_id", "..........."));
vals.Add(new KeyValuePair<string, string>("client_secret", "........"));
vals.Add(new KeyValuePair<string, string>("username", "................."));
vals.Add(new KeyValuePair<string, string>("password", "................."));
string TenantId = "............com";//your organizaion name
string url = string.Format("https://login.windows.net/{0}/oauth2/token", TenantId);
HttpClient hc = new HttpClient();
HttpContent content = new FormUrlEncodedContent(vals);
HttpResponseMessage hrm = hc.PostAsync(url, content).Result;
string responseData = "";
if (hrm.IsSuccessStatusCode)
{
Stream data = await hrm.Content.ReadAsStreamAsync();
using (StreamReader reader = new StreamReader(data, Encoding.UTF8))
{
responseData = reader.ReadToEnd();
}
}
AccessToken Token = JsonConvert.DeserializeObject<AccessToken>(responseData);
var result = await CallResoureApi(Token);
}
public async Task<string> CallResoureApi(AccessToken token)
{
var baseAddress = new Uri("https://api.powerbi.com/");
string jsonresult = "";
string requestUrl = baseAddress + "v1.0/myorg/datasets";
var client = new RestClient(baseAddress);
var request = new RestRequest("v1.0/myorg/datasets", Method.GET);
request.AddHeader("authorization", "Bearer " + token.access_token);
// execute the request
IRestResponse response = client.Execute(request);
var content = response.Content;
return content;
}
should i add something in header or body except bearer token in header and below in body
@Anonymous and everyone,
Thanks for the details. @Eric_Zhang ,Please confirm that it is absolutely not possible to use the PBI REST API with Client_ID and Client_Secret alone.
Do I really need to pass my Windows UN and PW with the request?!?
This seems:
1. Insecure
2. To defeat the purpose of registering an app in the first place!
a. A major goal of creating an AppID (and corresponding Client_ID/Secret) is to prevent having to directly login to a service!
I use api.powerbi.cn China PowerBi .
POST https://api.powerbi.cn/v1.0/myorg/groups/{groupId}/reports/{reportId}/ExportTo
Error Operation returned an invalid status code 'NotFound'
Reports - Export To File In Group not support api.powerbi.cn ??
Why?
Thanks
I gave all permission to my app but isues was something different.I was trying to get token based on azure active directy app client id and app secerete key.After doing google i found that i need to pass credentials of azure login account too.
Below code worked for me with valide token:
private async void SetAccessToken()
{
List<KeyValuePair<string, string>> vals = new List<KeyValuePair<string, string>>();
vals.Add(new KeyValuePair<string, string>("grant_type", "password"));
vals.Add(new KeyValuePair<string, string>("scope", "openid"));
vals.Add(new KeyValuePair<string, string>("resource", "https://analysis.windows.net/powerbi/api"));
vals.Add(new KeyValuePair<string, string>("client_id", "..........."));
vals.Add(new KeyValuePair<string, string>("client_secret", "........"));
vals.Add(new KeyValuePair<string, string>("username", "................."));
vals.Add(new KeyValuePair<string, string>("password", "................."));
string TenantId = "............com";//your organizaion name
string url = string.Format("https://login.windows.net/{0}/oauth2/token", TenantId);
HttpClient hc = new HttpClient();
HttpContent content = new FormUrlEncodedContent(vals);
HttpResponseMessage hrm = hc.PostAsync(url, content).Result;
string responseData = "";
if (hrm.IsSuccessStatusCode)
{
Stream data = await hrm.Content.ReadAsStreamAsync();
using (StreamReader reader = new StreamReader(data, Encoding.UTF8))
{
responseData = reader.ReadToEnd();
}
}
AccessToken Token = JsonConvert.DeserializeObject<AccessToken>(responseData);
var result = await CallResoureApi(Token);
}
public async Task<string> CallResoureApi(AccessToken token)
{
var baseAddress = new Uri("https://api.powerbi.com/");
string jsonresult = "";
string requestUrl = baseAddress + "v1.0/myorg/datasets";
var client = new RestClient(baseAddress);
var request = new RestRequest("v1.0/myorg/datasets", Method.GET);
request.AddHeader("authorization", "Bearer " + token.access_token);
// execute the request
IRestResponse response = client.Execute(request);
var content = response.Content;
return content;
}
and for anyone like me trying to do the same but with Postman to the Power BI APIs, the same applied - you have to add valid Power BI credentials to the GET while creating an AAD token:
API calls now work 🙂
Complete lack of documentation from Microsoft on this 😞 Even their 'Try It' wizard does not indicate the need for username & password ( https://docs.microsoft.com/en-us/rest/api/power-bi/groups/getgroups )
Sam
Join the community in Stockholm for expert Microsoft Fabric learning including a very exciting keynote from Arun Ulag, Corporate Vice President, Azure Data.
Check out the August 2024 Power BI update to learn about new features.
Learn from experts, get hands-on experience, and win awesome prizes.
User | Count |
---|---|
52 | |
22 | |
11 | |
11 | |
9 |
User | Count |
---|---|
112 | |
32 | |
30 | |
20 | |
19 |