Azure Отсутствует конечная точка идентификатора управляемой службы в службе приложений для контейнеров - PullRequest
0 голосов
/ 21 февраля 2020

Я пытаюсь развернуть свое приложение в Azure Службе приложений для контейнеров, используя предварительный просмотр docker. Конфигурация развертывания выглядит следующим образом:

version: "3.7"
services:
  auth:
    image: myorg/myimage
    environment:
      - MyOrg__Hosting__PathBase=/auth
      - ASPNETCORE_FORWARDEDHEADERS_ENABLED=true
      - ConnectionStrings__AuthenticationDatabase
  # other services not important for this question

В этом развертывании мне необходимо получить доступ к Azure Key Vault, с которым я интегрировал свое приложение через поставщика конфигурации Key Vault, согласно документация :

var azureServiceTokenProvider = new AzureServiceTokenProvider();
var keyVaultClient = new KeyVaultClient(
    new KeyVaultClient.AuthenticationCallback(
        azureServiceTokenProvider.KeyVaultTokenCallback));

    config.AddAzureKeyVault(
        $"https://{builtConfig["KeyVault:Name"]}.vault.azure.net/",
        keyVaultClient,
        DefaultKeyVaultSecretManager());

My Azure Key Vault имеет соответствующий набор политик доступа, и на страницах Kudu кажется, что переменные окружения MSI_ENDPOINT и MSI_SECRET были установлены в среда выполнения. Однако поставщику конфигурации Key Vault неоднократно не удается подключиться к Key Vault с ошибкой:

Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProviderException: Parameters: 
Connection String: [No connection string specified], Resource: https://vault.azure.net, 
Authority: https://login.windows.net/6e5e63bd-f497-4f71-a6f4-9d29200a8a61. Exception 
Message: Tried the following 3 methods to get an access token, but none of them worked.
2020-02-21T18:27:27.024474350Z Parameters: 
Connection String: [No connection string specified], Resource: https://vault.azure.net, 
Authority: https://login.windows.net/6e5e63bd-f497-4f71-a6f4-9d29200a8a61. Exception 
Message: Tried to get token using Managed Service Identity. Unable to connect to the Managed Service Identity (MSI) endpoint. Please check that you are running on an Azure resource that has MSI setup.
2020-02-21T18:27:27.024479550Z Parameters: 
Connection String: [No connection string specified], Resource: https://vault.azure.net, 
Authority: https://login.windows.net/6e5e63bd-f497-4f71-a6f4-9d29200a8a61. Exception 
Message: Tried to get token using Visual Studio. Access token could not be acquired. Environment variable LOCALAPPDATA not set.
2020-02-21T18:27:27.024483550Z Parameters: 
Connection String: [No connection string specified], Resource: https://vault.azure.net, 
Authority: https://login.windows.net/6e5e63bd-f497-4f71-a6f4-9d29200a8a61. Exception 
Message: Tried to get token using Azure CLI. Access token could not be acquired. No such file or directory

Первый из этих трех методов явно указывает на то, что MSI недоступен для некоторого повторного просмотра.

Я добавил ручной запрос для целей отладки, взятый из документации по управляемым удостоверениям :

public static async Task<HttpResponseMessage> GetToken(string resource, string apiversion)
{
    HttpClient client = new HttpClient();
    var msiEndpoint = Environment.GetEnvironmentVariable("MSI_ENDPOINT") ?? "MSI_ENDPOINT is not set!";
    Log.Logger.Debug("MSI_ENDPOINT is {MsiEndpoint}", msiEndpoint);
    client.DefaultRequestHeaders.Add("Secret", Environment.GetEnvironmentVariable("MSI_SECRET"));
    return await client.GetAsync(String.Format("{0}/?resource={1}&api-version={2}", msiEndpoint, resource, apiversion));
}

, и я ясно вижу в журналах своего приложения строку MSI_ENDPOINT is - так что оно установлено, но пусто или пробел. Это поддерживается InvalidOperationException, выданным запросом отладки, утверждающим, что «предоставлен недопустимый URI запроса. URI запроса должен быть либо абсолютным URI, либо должен быть установлен BaseAddress».

Я пытался отключение и повторное включение идентификатора, назначенного системой, перезапуск службы приложений и тройная проверка политик доступа к Key Vault - все безрезультатно. На данный момент, я думаю, я могу только предположить, что переменные окружения MSI_* не передаются в контейнер (ы) во время выполнения, и я не уверен, почему это будет.


Обновление: Я также попытался перечислить переменные окружения MSI_* в карте environment в моей конфигурации docker, но это также не помогло иметь какой-либо эффект.

1 Ответ

0 голосов
/ 24 февраля 2020

Что касается вашей проблемы, я думаю, что вы пропустили два шага для Управляемого удостоверения веб-приложения для контейнера.

Во-первых, вам нужно сначала включить Управляемое удостоверение. Например, вы используете систему типов, назначенную управляемой идентификации. Включите это так:

enter image description here

Тогда переменные окружения MSI_ENDPOINT и MSI_SECRET будут отображаться так:

enter image description here

Другое: если вам нужно использовать управляемую идентификацию для доступа к хранилищу ключей, вам необходимо предоставить достаточно разрешений для вашей управляемой идентификации. Вы можете выполнить действия, описанные в Назначение доступа к управляемым удостоверениям для ресурса с помощью Azure portal .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...