Power BI中的Office 365身份验证

时间:2015-12-22 06:27:02

标签: asp.net-mvc oauth-2.0 office365

我的应用程序(ASP.NET MVC)使用Office 365身份验证,它运行正常。但现在我想在我的应用程序中显示一些功能BI报告。但是,如果我使用Office 365访问令牌访问Power BI Web API,则会失败。有人可以给我这个工作代码吗?

o生成我在代码后使用的令牌。

    private static string getAccessToken()
    {
        var authority = "https://login.windows.net/<tenantId>";
        var authContext = new AuthenticationContext(authority);
        var clientCredential = new ClientCredential("clientId", "client Secret");
        var result = authContext.AcquireToken("https://analysis.windows.net/powerbi/api", clientCredential);

        return result.AccessToken;
    }

这将返回访问令牌。现在我将使用此访问令牌从power BI检索报告详细信息。

    protected void getReportsButton_Click(object sender, EventArgs e)
    {
        var token = getAccessToken();
        string responseContent = string.Empty;

        //Configure datasets request
        System.Net.WebRequest request = System.Net.WebRequest.Create(String.Format("{0}reports", baseUri)) as System.Net.HttpWebRequest;
        request.Method = "GET";
        request.ContentLength = 0;
        request.Headers.Add("Authorization", String.Format("Bearer {0}", token));

        //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
                PBIReports PBIReports = JsonConvert.DeserializeObject<PBIReports>(responseContent);

                tb_reportsResult.Text = string.Empty;
                //Get each Dataset from 
                foreach (PBIReport rpt in PBIReports.value)
                {
                    tb_reportsResult.Text += String.Format("{0}\t{1}\t{2}\n", rpt.id, rpt.name, rpt.embedUrl);
                }
            }
        }
    }

但是这个方法给了我一个错误(远程服务器返回了一个错误:(403)Forbidden。)。

谢谢, Erandika。

1 个答案:

答案 0 :(得分:0)

如果它可以提供帮助,这是我用来连接Power BI的代码。此示例还在我的Power BI订阅中查找数据集。

       private void Sign_Click(object sender, EventArgs e)
    {

        try
        {
            string resourceUri = "https://analysis.windows.net/powerbi/api";
            string clientID = "123456-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
            string redirectUri = "https://login.live.com/oauth20_desktop.srf";
            string authorityUri = "https://login.windows.net/common/oauth2/authorize";
            AuthenticationContext authContext = new AuthenticationContext(authorityUri);
            string token = authContext.AcquireToken(resourceUri, clientID, new Uri(redirectUri),PromptBehavior.RefreshSession).AccessToken;
            _MyToken = token;
            if (string.IsNullOrEmpty (_MyToken))
            {
                txtToken.Text = "Problème de connexion !";
            }
            else
            {
                txtToken.Text = "Connecté !";
                txtResultat.Clear();
                HttpWebRequest request = System.Net.WebRequest.Create(txtURI.Text) as System.Net.HttpWebRequest;
                request.KeepAlive = true;
                request.Method = "GET";
                request.ContentLength = 0;
                request.ContentType = "application/json";
                request.Headers.Add("Authorization", String.Format("Bearer {0}", _MyToken));

                using (HttpWebResponse httpResponse = request.GetResponse() as System.Net.HttpWebResponse)
                {
                    //Rajoutez la référence System.Web.Extensions
                    using (StreamReader reader = new System.IO.StreamReader(httpResponse.GetResponseStream()))
                    {
                        string responseContent = reader.ReadToEnd();
                        JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
                        Datasets datasets = (Datasets)jsonSerializer.Deserialize(responseContent, typeof(Datasets));                      


                        for (int i = 0; i < datasets.value.Count(); i++)
                        {
                            txtResultat.Text += "{" + i + "} " + datasets.value[i].Name + "\r\n";
                            comboDataSets.Items.Insert (i, datasets.value[i].Name);
                            MyDataSet.Add(new dataset(datasets.value[i].Id, datasets.value[i].Name));                          
                        }
                    }
                }

            }

        }
        catch (Exception MyEx)
        {
            MessageBox.Show(MyEx.Message);
        }

    }