401 - Несанкционированная ошибка при обновлении набора данных PowerBI - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь обновить набор данных для отчета PowerBI.Я создал шлюз, и я могу выполнить обновление набора данных на портале администратора.Я мог бы подтвердить, что обновление прошло успешно из пользовательского интерфейса, то есть столбца Последнее обновление на портале администратора.Но когда я пытаюсь выполнить обновление из кода webapi на C #, я получаю указанную ниже ошибку.

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 Ответ

0 голосов
/ 06 июня 2018

Это похоже на неправильную конфигурацию разрешений приложения Azure Active Directory, которое вы используете для обновления.Как показано здесь , нам нужно зарегистрировать собственное приложение и объявить некоторые разрешения, чтобы иметь доступ к API-интерфейсу Power BI.

Вы должны убедиться, что у этого приложения есть разрешение Dataset.ReadWrite.All.Вы можете просматривать и даже изменять разрешения приложения на портале Azure в Azure Active Directory -> App Registrations.Если вы не видите приложение, выберите All apps из выпадающего меню справа.

Вот так выглядит наше приложение, которое мы успешно используем для обновления через остальной API

enter image description here

...