Встраивание встроенного Power BI дает ошибку 406 Not Acceptable - PullRequest
0 голосов
/ 27 февраля 2019

Когда мы попытались встроить «Power BI внедренный» в наше существующее приложение, мы столкнулись с ошибкой 406, не принятой.Чтобы убедиться, что это не было вызвано нашим собственным приложением, мы использовали пример кода в образце репозитория power bi: https://github.com/Microsoft/PowerBI-Developer-Samples. Мы использовали сценарий «App Owns Data», поскольку наши конечные пользователи не владеют лицензиями Power BI Pro,Мы выполнили все необходимые шаги по настройке и предоставили необходимые учетные данные / идентификаторы в файле web.config.

При первой попытке запустить приложение мы получили ошибку закрытия соединения.После некоторых исследований мы обнаружили, что это было вызвано неправильной версией TLS.Добавление ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; к контроллеру решило эту проблему.

Следующая ошибка, с которой мы столкнулись, была в следующей строке кода:

var authenticationResult = await authenticationContext.AcquireTokenAsync(ResourceUrl, ApplicationId, credential);

Эта строка завершилась исключением http: 406 - Недопустимо,Когда мы проверяли трафик с помощью Fiddler, эта ошибка считалась логичной, поскольку наша Azure AD ссылается на наш сервер ADFS в качестве проверяющей стороны с заголовком accept для содержимого JSON, а наша ADFS возвратила тело xml.Мы пришли к выводу, что AcquireTokenAsync не работает правильно с нашей корпоративной средой Azure AD / ADFS.Чтобы исследовать это, мы провели несколько тестов:

  1. Вместо того, чтобы использовать стандартную библиотеку ADAL, мы попытались использовать библиотеку MSAL.Однако это привело к той же ошибке.

  2. Выполнение (необработанного) пост-запроса в Azure AD для получения токена авторизации со следующим кодом: <pre> try { client.DefaultRequestHeaders.Add("Cache-Control", "no-cache"); _result = await client.PostAsync( new Uri("<a href="https://login.windows.net/common/oauth2/token" rel="nofollow noreferrer">https://login.windows.net/common/oauth2/token</a>"), new FormUrlEncodedContent( new[] { new KeyValuePair("resource", "<a href="https://analysis.windows.net/powerbi/api" rel="nofollow noreferrer">https://analysis.windows.net/powerbi/api</a>"), new KeyValuePair("client_id", ClientId), new KeyValuePair("grant_type", "password"), new KeyValuePair("username", UserName), new KeyValuePair("password", Password), new KeyValuePair("scope", "openid"), })); } catch (HttpOperationException ex) { //Bad Request var content = ex.Response.Content; Console.WriteLine(content); }

Это привело к следующей ошибке, которую нам не удалось устранить:

{"error": "invalid_grant", "error_description": "AADSTS70002: Ошибка при проверке учетных данных. AADSTS50126:Неверное имя пользователя или пароль \ r \ nTrace ID: b8a97eae-63a4-4d56-8afd-e18eb7b02800 \ r \ nКорреляционный идентификатор: 3e168d8f-61ab-4b7f-b9c4-6ae7870c5e06 \ r \ nTimestamp: 2018-12-03 12: 59 38, "error_codes": [70002,50126], "timestamp": "2018-12-03 12: 59: 38Z", "trace_id": "b8a97eae-63a4-4d56-8afd-e18eb7b02800", "correlation_id": "3e168d8f-61ab-4b7f-b9c4-6ae7870c5e06" }

Мы успешно выполнили интерактивный вход в систему, используя следующий код:

var authenticationResult = await authenticationContext.AcquireTokenAsync(ResourceUrl, ApplicationId, new Uri("http://localhost:42734/"), new PlatformParameters(PromptBehavior.Auto));

Однако это не идеально, поскольку мы не хотим, чтобы нашиконечные пользователи (в интерактивном режиме) входят в систему с помощью учетной записи-посредника в нашей AD при каждом использовании Power BI, встроенной в наше приложение:)

После того, как блог от Microsoft об этом сценарии также не дал результатов: https://blogs.msdn.microsoft.com/azuredev/2018/01/22/accessing-the-power-bi-apis-in-a-federated-azure-ad-setup/

Вопрос был в том, как это исправить .... Смотрите ответ ниже, который мы нашли через несколько месяцев (!) поиска.

1 Ответ

0 голосов
/ 27 февраля 2019

После нескольких месяцев поисков мой коллега на другом конце света помог мне.Решение было простым: использовать учетную запись-посредник, созданную в Azure AD, но неизвестную в проверяющей AD.Таким образом, аутентификация будет проходить в Azure AD, а проверяющая ADFS не используется.Это предотвратит все ошибки, с которыми мы столкнулись, и включит аутентификацию ADAL и MSAL.

Когда мы начали встраивать Power BI в наше собственное приложение .NET Core, мы обнаружили, что в настоящее время лучшим вариантом является пост-запрос, посколькумы не можем найти подходящие методы для аутентификации имени пользователя и пароля в библиотеках .NET Core.Почтовый запрос также хорошо работает с решением, упомянутым ранее.

Надеюсь, этот намек сэкономит кому-то время, которое у нас ушло ...

...