Хранилище ключей доступа из локального кластера Service Fabric с назначенным пользователем управляемым идентификатором (MSI)

#asp.net-core #azure-service-fabric #azure-keyvault #azure-managed-identity

#asp.net-ядро #azure-service-fabric #azure-keyvault #azure-managed-identity

Вопрос:

Я хочу получить доступ к хранилищу ключей из моего приложения Service Fabric через Managed Service Identity (MSI). Я включил MSI в масштабе виртуальной машины, установленном на портале Azure, и предоставил ему доступ к моему ресурсу хранилища ключей. В облаке это работает как волшебство. Однако у меня возникли проблемы с моей локальной средой разработки.

Насколько я понимаю, я могу предоставить себе доступ к хранилищу ключей и запустить az login в Azure CLI. Увы, это не работает при запуске приложения в локальном кластере Service Fabric. Я использую .net core 2.1 в service fabric и получаю указанное ниже исключение.

Azure.Идентификация.Исключение AuthenticationFailedException: DefaultAzureCredential не удалось получить токен из включенных учетных данных.

  • Аутентификация по умолчанию в среде недоступна. Переменные среды настроены не полностью.
  • Недоступна аутентификация ManagedIdentityCredential. Конечная точка управляемой идентификации не найдена.
  • Ошибка аутентификации SharedTokenCacheCredential: проверка сохраняемости не удалась. Проверьте внутреннее исключение для получения подробной информации
  • Невозможно получить доступ к поставщику токенов Visual Studio на C:UsersDefaultAppDataLocal .IdentityServiceAzureServiceAuthtokenprovider.json
  • Ошибка аутентификации VisualStudioCodeCredential: указанный сеанс входа в систему не существует. Возможно, оно уже было завершено.

Ответ №1:

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

Попробуйте создать переменные среды на уровне компьютера для доступа к хранилищу:

  • Создайте участника службы с паролем. Выполните приведенные здесь действия, чтобы создать участника-службу и предоставить ему разрешения на хранилище ключей.
  • Задайте переменной среды с именем AzureServicesAuthConnectionString значение RunAs=App;AppID=AppID;TenantId=TenantId;AppKey=Secret. Вам необходимо заменить AppID, TenantId и Secret на фактические значения с шага # 1.
  • Запустите приложение в вашей локальной среде разработки. Изменение кода не требуется. AzureServiceTokenProvider будет использовать эту переменную среды и использовать участника службы для аутентификации в Azure AD.

Не забудьте перезапустить, чтобы переменные среды добавлялись ко всем процессам.

Ответ №2:

Как показано в документе DefaultAzureCredential , среда и управляемая идентификация представляют собой развернутую проверку подлинности службы. Azure CLI необходимо войти в систему с вашей учетной записью Azure с помощью az login команды.

Итак, среда и управляемая идентификация подходят для вас. Например, при использовании среды сначала необходимо установить переменные среды, см. Здесь. Затем вы могли бы создать секретный клиент, используя значение по умолчанию.

 // Create a secret client using the DefaultAzureCredential
var client = new SecretClient(new Uri("https://myvault.azure.vaults.net/"), new DefaultAzureCredential());
  

Ответ №3:

Я смог заставить это работать с разработкой локальной service fabric, открыв Services.msc на моем локальном компьютере разработки и настроив «Службу узла Service Fabric» для запуска от имени моей учетной записи локального пользователя, а не локальной службы по умолчанию.

Только тогда DefaultAzureCredential будет работать для получения логина Az CLI.

Комментарии:

1. Я попробовал это, и это сработало, однако fabric:/ System / EventStoreService начал показывать ошибку, поэтому я предполагаю, что это официально не поддерживается.