代码之家  ›  专栏  ›  技术社区  ›  Krishnan

401-数据集刷新PowerBI期间出现未经授权的错误

  •  3
  • Krishnan  · 技术社区  · 7 年前

    我正在尝试刷新PowerBI报告的数据集。我创建了网关,可以从管理门户刷新数据集。我可以从用户界面(即管理门户中的最后一个刷新列)验证刷新是否成功。但是当我尝试从C#webapi代码刷新时,我得到了下面提到的错误。

    Error Message:
    The remote server returned an error: (401) Unauthorized.
    
    Stack Trace:
       at System.Net.HttpWebRequest.GetResponse()
       at BlueSkyPowerBIService.Controllers.PowerBIController.<RefreshDatasetsForReports>d__13.MoveNext() in C:\Krishnan\RSI\SourceCode\Bluesky Developement\BlueSky Development\BlueSkyPowerBIService\BlueSkyPowerBIService\Controllers\PowerBIController.cs:line 258
    

    在刷新代码之前,我可以对Azure AD进行身份验证,它成功并生成了身份验证令牌,但是当它调用API刷新时,它会因上述错误而崩溃。

    请查找我用于数据刷新的代码

    List<ReportDetails> reportDetailsList = new List<ReportDetails>();
    
                var result = new EmbedConfig();
                ReportDetails reportDetails = new ReportDetails();
                try
                {
                    result = new EmbedConfig { Username = username, Roles = roles };
                    var error = GetWebConfigErrors();
                    if (error != null)
                    {
                        result.ErrorMessage = error;
                        //return View(result);
                        return null;
                    }
                    var credential = new UserPasswordCredential(Username, Password);
    
                    var authenticationContext = new AuthenticationContext(AuthorityUrl);
                    var authenticationResult = await authenticationContext.AcquireTokenAsync(ResourceUrl, ClientId, credential);
    
                    if (authenticationResult == null)
                    {
                        result.ErrorMessage = "Authentication Failed.";
                        //return View(result);
                        return null;
                    }
    
                    var tokenCredentials = new TokenCredentials(authenticationResult.AccessToken, "Bearer");
    
                    // Create a Power BI Client object. It will be used to call Power BI APIs.
                    using (var client = new PowerBIClient(new Uri(ApiUrl), tokenCredentials))
                    {
                        // Get a list of reports.
                        var reports = await client.Reports.GetReportsAsync();
                        for (int index = 0; index < reports.Value.Count; index++)
                        {
                            reportDetails = new ReportDetails();
                            Report report = reports.Value[index];
    
                            HttpWebRequest request;
    
                            if (report.Id == "6317f207-57d3-4f5f-9644-18bfbb9bef99")
                            {
                                var url = "https://api.powerbi.com/v1.0/myorg/groups/{0}/datasets/{1}/refreshes";
                                request = System.Net.HttpWebRequest.CreateHttp(String.Format(url, GroupId, report.DatasetId));
    
                                request.KeepAlive = true;
                                request.Method = "POST";
                                request.ContentLength = 0;
    
                                request.Headers.Add("Authorization", String.Format("Bearer {0}", authenticationResult.AccessToken));
    
                                using (Stream writer = request.GetRequestStream())
                                {
                                    var response = (HttpWebResponse)request.GetResponse();
                                    Console.WriteLine("Dataset refresh request{0}", response.StatusCode.ToString());
                                }
                            }
                        }//end for(int index=0; index< reports.Value.Count; index++)
                        return reportDetailsList;
                    }
                }
                catch (HttpOperationException exc)
                {
                    result.ErrorMessage = string.Format("Status: {0} ({1})\r\nResponse: {2}\r\nRequestId: {3}", exc.Response.StatusCode, (int)exc.Response.StatusCode, exc.Response.Content, exc.Response.Headers["RequestId"].FirstOrDefault());
                }
                catch (Exception exc)
                {
                    result.ErrorMessage = exc.ToString();
                }

    我已在应用程序注册下授予Azure门户中所有必需的权限, enter image description here

    你知道我为什么会犯这个错误吗?如何解决这个问题?

    1 回复  |  直到 7 年前
        1
  •  0
  •   xabikos    7 年前

    这似乎是对用于执行刷新的Azure活动目录应用程序权限的错误配置。如图所示 here

    您需要确保此应用程序具有 Dataset.ReadWrite.All Azure Active Directory -> App Registrations . 如果看不到应用程序,请选择 All apps 从右边的下拉菜单。

    这就是我们的应用程序的外观,我们使用它成功地通过rest API执行刷新

    enter image description here