如何使用非交互式身份validation连接到Power BI API?

用C#编码。 我正在遵循这个指南:

https://azure.microsoft.com/en-us/documentation/articles/resource-group-authenticate-service-principal/#authenticate-service-principal-with-password—powershell%E2%80%8C%E2 %80%8B

但它不起作用而且不是Power BI特定的,因此我不确定如何将其应用于Power BI API。

在我尝试连接到Power BI时,我收到403 Forbidden响应。

var authenticationContext = new AuthenticationContext("https://login.windows.net/" + Properties.Settings.Default.TenantID); var credential = new ClientCredential(clientId: Properties.Settings.Default.ClientID, clientSecret: Properties.Settings.Default.ClientSecretKey); var result = authenticationContext.AcquireToken(resource: "https://management.core.windows.net/", clientCredential: credential); if (result == null) { throw new InvalidOperationException("Failed to obtain the JWT token"); } string accessToken = result.AccessToken; string responseContent = string.Empty; //The resource Uri to the Power BI REST API resource string datasetsUri = "https://api.powerbi.com/v1.0/myorg/datasets"; //Configure datasets request System.Net.WebRequest request = System.Net.WebRequest.Create(datasetsUri) as System.Net.HttpWebRequest; request.Timeout = 20000; request.Method = "GET"; request.ContentLength = 0; request.Headers.Add("Authorization", String.Format("Bearer {0}", accessToken)); try { //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); } } } } catch (WebException wex) { resultsTextbox.Text = wex.Message; } } 

尝试更改资源URI:

 var result = authenticationContext.AcquireToken(resource: "https://management.core.windows.net/", clientCredential: credential); 

 var result = authenticationContext.AcquireToken(resource: **"https://analysis.windows.net/powerbi/api"**, clientCredential: credential); 

您想获取power bi api的令牌。

希望有帮助。

编辑基于OP评论更新答案:

这是你需要做的。

在Azure AD中创建一个“本机应用程序”并获取该客户端ID将没有秘密。

确保您拥有Nuget Active Directory身份validation库2.23.302261847的最新版ADAL

您将需要使用此获取令牌重载:

 authContext.AcquireToken("https://analysis.windows.net/powerbi/api", clientID, new UserCredential(, )); 

编辑:2016-11-11

ADAL 3.13.7 UserCredentail不再具有上面定义的构造函数。 有一个新的密封类UserPasswordCredential

 public sealed class UserPasswordCredential : UserCredential 

其中包含与以前的UserCredential对象匹配的构造函数

 public UserPasswordCredential(string userName, string password) 

您可以通过执行以下操作获取令牌:

 authContext.AcquireToken("https://analysis.windows.net/powerbi/api", clientID, new UserPasswordCredential(, )); 

PowerBI网站上有学费: https ://powerbi.microsoft.com/en-us/documentation/powerbi-developer-what-you-need-to-create-an-app/。

本文详细指导了如何创建PowerBI Web应用程序,包括在Azure AD中注册应用程序以及如何获取ClientID。 这些步骤不难理解和遵循。 如果您需要,请告诉我。 如果您有任何疑问,请保持联系。

此页面中有一个简单的示例: https : //powerbi.microsoft.com/en-us/documentation/powerbi-developer-authenticate-a-web-app/