how to connect to Power BI API using non-interactive authentication?

萝らか妹 提交于 2020-01-13 05:08:08

问题


Coding in C#. I'm following this guide:

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

But it is not working and it is not Power BI specific so I'm not sure exactly how to apply it to the Power BI API.

In my attempt to connect to Power BI I am getting a 403 Forbidden response.

        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;
        }
    }

回答1:


Try changing the resource URI:

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

to

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

You want to acquire a token for the power bi api.

Hope that Helps.

EDIT Updating Answer Based on OP Comment:

Here is what you will need to do.

In Azure AD create a "Native App" and get that client ID there will be NO Secret.

Make sure you have the latest version of ADAL from Nuget Active Directory Authentication Library 2.23.302261847

You will need to use this Acquire Token Overload:

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

EDIT: 2016-11-11

ADAL 3.13.7 UserCredentail no longer has a constructor as defined above. There is a new sealed class UserPasswordCredential

public sealed class UserPasswordCredential : UserCredential

Which has the constructor that matches the former UserCredential object

public UserPasswordCredential(string userName, string password)

You can acquire the token by doing this:

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



回答2:


There is a tuition in PowerBI website: https://powerbi.microsoft.com/en-us/documentation/powerbi-developer-what-you-need-to-create-an-app/.

The article has detailed guide that how to create a PowerBI web app, include registering a application in Azure AD and get the ClientID so on. These steps are not difficult to understand and follow. Let me know if it is your need. Keep contact if you have any questions.

There is a simple sample in this page: https://powerbi.microsoft.com/en-us/documentation/powerbi-developer-authenticate-a-web-app/



来源:https://stackoverflow.com/questions/35692974/how-to-connect-to-power-bi-api-using-non-interactive-authentication

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!