Я пытаюсь использовать HttpClient для подключения к веб-службе, размещенной в службе приложений Azure, которая защищена с помощью AAD с использованием идентификатора управляемой службы.
При попытке подключения из клиентского кода с помощью AzureServiceTokenProvider я получаю исключение AzureServiceTokenProviderException при попытке получить токен
Базовая настройка:
AAD-арендатор AADX.onmicrosoft.com
Содержит регистрацию приложения для целевой службы приложений mytest. Он имеет идентификатор приложения XXXXXXXX-XXXX-49e6-a806-5440b00282b1 и в соответствии с манифестом имеет идентификатор URL "https://AADX.onmicrosoft.com/mytest"
Служба приложений "mytest" была создана в рамках подписки под этим AAD, поэтому с URL https://mytest.azurewebsites.net
В настройке аутентификации для службы приложения включена функция «Аутентификация службы приложения». Действие, которое нужно выполнить, если запрос не прошел проверку подлинности, имеет значение «Войти в Azure Active Directory». Провайдер аутентификации AAD настроен с экспресс-настройками, указывающими на AADX и использующими приложение mytest.
У нас есть ресурсы для общения с этой службой приложений как внутри нашего лазурного арендатора, так и за его пределами. Ресурсы за пределами Azure Tenant направляются через управление API к определенным частям API, которые им необходимы, с контролируемым образом используя ключи подписки.
Существуют службы приложений и настольные приложения, размещенные в RemoteApp, которым необходим доступ ко всем службам, размещенным в приложении. Управляемая идентификация включена для всей инфраструктуры в клиенте, который должен подключиться.
Когда я использую приведенный ниже код, я получаю исключение в связи с невозможностью получить токен. Если я изменю запрашиваемый ресурс на "https://login.microsoftonline.com/", то я могу получить токен, хотя и неправильный (на самом деле он регистрирует мой сетевой логин MS, а не учетную запись, выбранную в настройках)
private static HttpClient ConnectToClient()
{
String BaseUrl = "https://mytest.azurewebsites.net/";
String AdResource = "https://AADX.onmicrosoft.com/mytest";
AzureServiceTokenProvider TokenProvider = new AzureServiceTokenProvider();
String Token = TokenProvider.GetAccessTokenAsync(AdResource).Result;
HttpClient Client = new HttpClient()
{
BaseAddress = new Uri(BaseUrl)
};
Client.DefaultRequestHeaders.Accept.Clear();
Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
Client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", Token);
return Client;
}
private static String GetContent()
{
String Output = String.Empty;
using (HttpClient Client = ConnectToClient())
{
HttpResponseMessage ResponseMessage = Client.GetAsync("api/Test/").Result;
if (ResponseMessage.IsSuccessStatusCode)
{
Output = ResponseMessage.Content.ReadAsStringAsync().Result;
}
}
return Output;
}
Я ожидаю, что токен будет возвращен как допустимое значение, которое будет использоваться в качестве токена на предъявителя. Вместо этого в точке вызова GetAccessTokenAsync выдается следующее исключение:
System.AggregateException
HResult = 0x80131500
Сообщение = произошла одна или несколько ошибок. (Параметры: Строка подключения: [Строка подключения не указана], Ресурс: https://AADX.onmicrosoft.com/mytest, Полномочия:. Сообщение об исключении: пробовал следующие 3 метода для получения токена доступа, но ни один из них не работал.
Параметры: Строка подключения: [Строка подключения не указана], Ресурс: https://AADX.onmicrosoft.com/mytest, Полномочия:. Сообщение об исключении: Попытка получить токен с использованием идентификатора управляемой службы. Невозможно подключиться к конечной точке MSI. Убедитесь, что вы работаете на ресурсе Azure, для которого настроена MSI.
Параметры: Строка подключения: [Строка подключения не указана], Ресурс: https://AADX.onmicrosoft.com/mytest, Полномочия:. Сообщение об исключении: Попытка получить токен с помощью Visual Studio. Не удалось получить токен доступа.
Исключение для поставщика токенов Visual Studio Microsoft.Asal.TokenService.exe: TS003: ошибка, TS004: невозможно получить токен доступа. «Не удалось обновить токен доступа»