Когда мы попытались встроить «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.Чтобы исследовать это, мы провели несколько тестов:
Вместо того, чтобы использовать стандартную библиотеку ADAL, мы попытались использовать библиотеку MSAL.Однако это привело к той же ошибке.
Выполнение (необработанного) пост-запроса в 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/ Вопрос был в том, как это исправить .... Смотрите ответ ниже, который мы нашли через несколько месяцев (!) поиска.