Операция вернула недопустимый код состояния "Не авторизован"

Я пытаюсь встроить пример панели мониторинга Power BI в приложение WPF, следуя примеру проекта и своего рода учебному пособию. Когда я запускаю приложение, мне нужно ввести свой пароль для аутентификации, а когда оно пытается получить список моих рабочих пространств Power BI с getAppWorkspacesList() Я получаю это сообщение об ошибке

Microsoft.Rest.HttpOperationException: "Операция вернула недопустимый код состояния" Не авторизован ""

Может кто-нибудь помочь, указав, почему эта ошибка происходит? Я пытался разобраться в деталях ошибки, но я не понимаю, что может быть причиной проблемы. Мне удалось без проблем встроить панель мониторинга в.Net Web App, поэтому я не думаю, что проблема в моей учетной записи Power BI или Azure Directory.

private static string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"];
private static string tenant = ConfigurationManager.AppSettings["ida:Tenant"];
private static string clientId = ConfigurationManager.AppSettings["ida:ClientId"];
Uri redirectUri = new Uri(ConfigurationManager.AppSettings["ida:RedirectUri"]);
private static string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant);

private static string graphResourceId = ConfigurationManager.AppSettings["ida:ResourceId"];
private AuthenticationContext authContext = null;

TokenCredentials tokenCredentials = null;
string Token = null;
string ApiUrl = "https://api.powerbi.com";



public MainWindow()
{
    InitializeComponent();
    TokenCache TC = new TokenCache();
    authContext = new AuthenticationContext(authority, TC);
}


private void getAppWorkspacesList()
{
    using (var client = new PowerBIClient(new Uri(ApiUrl), tokenCredentials))
    {
        appWorkSpacesList.ItemsSource = client.Groups.GetGroups().Value.Select(g => new workSpaceList(g.Name, g.Id));                
    }
}

1 ответ

Решение

Исходя из вашего описания, я предположил, что вы используете токен доступа для пользователей Power BI (пользователь владеет данными). Я бы порекомендовал вам использовать https://jwt.io/ для декодирования access_token после успешного вызова authContext.AcquireTokenAsync, Убедитесь, что aud является https://analysis.windows.net/powerbi/api и проверьте свойство области разрешений scp,

Для групп Get требуемая область будет выглядеть следующим образом:

Обязательная область: Group.Read.All или Group.ReadWrite.All или Workspace.Read.All или Workspace.ReadWrite.All

Вы также можете использовать fiddler или postman для имитации запроса к конечной точке get groups с помощью access_token, полученного в вашем приложении WPF, чтобы сузить эту проблему.

Кроме того, вы можете выполнить " Регистрация приложения", чтобы проверить приложение Azure AD и убедиться, что необходимые делегированные разрешения для API службы Power BI (Microsoft.Azure.AnalysisServices) были правильно настроены.

Мы получили ту же ошибку, когда мы используем приложение, использующее данные. Способ решения этого описан здесь.

По сути, способ получения токена доступа, описанного на веб- сайте Microsoft, не работает. В итоге мы выполняем вызов API REST к https://login.microsoftonline.com/common/oauth2/token и публикуем следующие данные:

  • grant_type: пароль
  • область применения: openid
  • ресурс: https://analysis.windows.net/powerbi/api
  • client_id: APPLICATION_ID
  • client_secret: APPLICATION_SECRET
  • имя пользователя: USER_ID
  • пароль: USER_PASSWORD

Вы получите обратно JSON, а затем получите access_token, который будет использоваться при создании Power Bi-клиента, например:

    var mTokenCredentials = new TokenCredentials(accessToken, "Bearer");
    using (var client = new PowerBIClient(new Uri("https://api.powerbi.com"), mTokenCredentials))

Я надеюсь, что это может кому-то помочь. Это оригинальный пост.

Другие вопросы по тегам