была предпринята попытка получить доступ к сокету способом, запрещенным его правами доступа, вызывая Azure IMDS - PullRequest
0 голосов
/ 11 июля 2019

У меня проблемы с вызовом службы метаданных экземпляра Azure (IMDS) из службы приложений для получения токена. У нас есть служба приложений, которая была создана> 18 месяцев назад. Недавно мы включили Managed Identity для этого. На странице портала Azure есть отличная ссылка , которая описывает MI и как его использовать.

Однако, когда я пытаюсь сделать вызов REST для http://169.254.169.254/metadata/identity/oauth2/token, используя документированные параметры, я всегда получаю исключение an attempt was made to access a socket in a way forbidden by its access permissions. Есть ли какая-то локальная конфигурация, которую нам нужно включить, чтобы эта конечная точка работала? Это что-то, что не будет работать, потому что эта служба приложений была создана так давно?

Я могу использовать MSI VM Extension и получить токен успешно, но в документе упоминается, что этот API должен был устареть в январе 2019 года. Я также могу успешно использовать библиотеку Microsoft.Azure.Services.AppAuthentication и получить действительный токен.

Я бы предпочел сделать простой вызов REST, поскольку именно так мы общаемся с нашими другими зависимыми службами. Примеры фрагментов приведены ниже.

Может ли кто-нибудь помочь мне понять лучший выбор здесь?

MSI VM Extension (работает, но задокументировано как устаревшее)

var endpoint = environment.MSI_ENDPOINT;
uri = new Uri($"{endpoint}?api-version=2017-09-01&resource=https://{audience}");
var req = new HttpRequestMessage(HttpMethod.Get, uri);
req.Headers.Add("Secret", environment.MSI_SECRET); 
var resp = await client.SendAsync(req);
var text = await resp.Content.ReadAsStringAsync();

Использование nuget TokenProvider (работает, но добавляет другой код в код)

var azureServiceTokenProvider = new AzureServiceTokenProvider();
token = await azureServiceTokenProvider.GetAccessTokenAsync($"https://{audience}/");

Вызов IMDS Azure (выбрасывает an attempt was made to access a socket in a way forbidden by its access permissions.)

uri = new Uri($"http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://{audience}");
var req = new HttpRequestMessage(HttpMethod.Get, uri);
req.Headers.Add("Metadata", "true"); // api requirement
var resp = await client.SendAsync(req);
var text = await resp.Content.ReadAsStringAsync();

1 Ответ

1 голос
/ 11 июля 2019

Ссылка , которую вы указали , может быть более ясной по этому поводу, но IMDS присутствует только на виртуальных машинах Azure и относится к ним.

Чтобы получить токен доступа из службы приложений, вам нужноиспользуйте переменные окружения MSI_ENDPOINT и MSI_SECRET.Так работают оба первых двух варианта (см. Реализацию в библиотеке AppAuth ).Оба примера также используют одну и ту же версию вызовов REST / API, что означает, что использование любого из этих параметров будет функционально эквивалентным.Таким образом, при выборе между этими двумя вариантами, это зависит от ваших предпочтений.:)

AzureServiceTokenProvider в библиотеке / Nuget AppAuth обеспечивает слой абстракции от логики извлечения токена, а также встроенный кэш токена и упрощенную аутентификацию между локальной разработкой и prod /тестовые развертывания.Вы можете узнать больше о библиотеке AppAuth и ее преимуществах здесь .

...