如何连接到使用非交互认证电源BI API? [英] how to connect to Power BI API using non-interactive authentication?

查看:404
本文介绍了如何连接到使用非交互认证电源BI API?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

编码在C#。
我按照本指南:

<一个href=\"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\" rel=\"nofollow\">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

但它不工作,这是不是电力BI专用的,所以我不知道究竟是如何将其应用到Power BI API。

在我尝试连接到电源BI我得到一个403禁止响应。

  VAR authenticationContext =新AuthenticationContext(https://login.windows.net/+ Properties.Settings.Default.TenantID);
        VAR证书=新ClientCredential(的clientId:Properties.Settings.Default.ClientID,clientSecret:Properties.Settings.Default.ClientSecretKey);
        VAR的结果= authenticationContext.AcquireToken(资源:https://management.core.windows.net/,clientCredential:证书);        如果(结果== NULL)
        {
            抛出新的InvalidOperationException异常(无法获得令牌JWT);
        }        字符串的accessToken = result.AccessToken;
        字符串responseContent =的String.Empty;        //资源URI到Power BI REST API资源
        字符串datasetsUri =htt​​ps://api.powerbi.com/v1.0/myorg/datasets;        //配置数据集的请求
        System.Net.WebRequest请求= System.Net.WebRequest.Create(datasetsUri)为System.Net.HttpWebRequest;
        request.Timeout = 20000;
        request.Method =GET;
        request.ContentLength = 0;
        request.Headers.Add(授权,的String.Format(承载{0}的accessToken));        尝试
        {            //从request.GetResponse数据集的响应()
            使用(VAR响应= request.GetResponse()作为System.Net.HttpWebResponse)
            {
                //从响应流中获取读者
                使用(VAR读卡器=新就是System.IO.StreamReader(response.GetResponseStream()))
                {
                    responseContent = reader.ReadToEnd();                    //反序列化JSON字符串
                    //的JavaScriptSerializer类是在System.Web.Script.Serialization
                    JSON的JavaScriptSerializer =新的JavaScriptSerializer();
                    数据集的数据集=(数据集)json.Deserialize(responseContent的typeof(数据集));                    resultsTextbox.Text =的String.Empty;
                    //从每个数据集
                    的foreach(在datasets.value数据DS)
                    {
                        resultsTextbox.Text + =的String.Format({0} \\ t {1} \\ n,ds.Id,ds.Name);
                    }
                }
            }
        }
        赶上(引发WebException WEX)
        {
            resultsTextbox.Text = wex.Message;
        }
    }


解决方案

试着改变资源URI:

VAR的结果= authenticationContext.AcquireToken(资源: https://management.core.windows.net/ ,clientCredential:凭证);

VAR的结果= authenticationContext.AcquireToken(资源: https://analysis.windows.net / powerbi / API ,clientCredential:凭证);

您想要获得的功率双向API的令牌。

希望有所帮助。

基于OP注释编辑更新应答:

下面是你需要做的事情。

在Azure的AD建立一个原生应用,并得到客户端ID会有什么秘密。

请确保你从的NuGet Active Directory验证库的最新版本ADAL的2.23.302261847

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

  authContext.AcquireToken(https://analysis.windows.net/powerbi/api,客户端ID,新UserCredential(小于用户名&gt;,&LT;密码和GT;));

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

解决方案

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

这篇关于如何连接到使用非交互认证电源BI API?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆