У меня проблемы с вызовом службы метаданных экземпляра 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();