Azure MSI в службе приложений
Я включил управляемые идентификаторы служб в службе приложений. Однако мои WebJobs не могут получить доступ к ключам.
Они сообщают:
Tried the following 3 methods to get an access token, but none of them worked.
Parameters: Connectionstring: [No connection string specified], Resource: https://vault.azure.net, Authority: . 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.
Parameters: Connectionstring: [No connection string specified], Resource: https://vault.azure.net, Authority: https://login.microsoftonline.com/common. Exception Message: Tried to get token using Active Directory Integrated Authentication. Access token could not be acquired. password_required_for_managed_user: Password is required for managed user
Parameters: Connectionstring: [No connection string specified], Resource: https://vault.azure.net, Authority: . Exception Message: Tried to get token using Azure CLI. Access token could not be acquired. 'az' is not recognized as an internal or external command,
Kudo не показывает никаких переменных среды MSI_.
Как это должно работать? Это существующий план обслуживания приложения.
10 ответов
Библиотека AppAuthentication использует внутреннюю конечную точку в службе приложений, которая получает токены от имени вашего сайта. Эта конечная точка не является статичной и поэтому имеет значение переменной среды. После активации MSI для вашего сайта через ARM ваш сайт необходимо будет перезапустить, чтобы в нем были установлены две новые переменные среды:
MSI_ENDPOINT и MSI_SECRET
Наличие этих переменных необходимо для правильной работы функции MSI во время выполнения, поскольку библиотека AppAuthentication использует их для получения токена авторизации. Сообщение об ошибке отражает это:
Сообщение об исключении: Попытка получить токен с использованием идентификатора управляемой службы. Невозможно подключиться к конечной точке MSI. Убедитесь, что вы работаете на ресурсе Azure, для которого настроена MSI.
Если эти переменные отсутствуют, вам может потребоваться перезапустить сайт.
https://docs.microsoft.com/en-us/azure/app-service/app-service-managed-service-identity
Если переменные среды установлены, и вы все еще видите ту же ошибку, в статье выше приведен пример кода, показывающий, как вручную отправлять запросы на эту конечную точку.
public static async Task<HttpResponseMessage> GetToken(string resource, string apiversion) {
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("Secret", Environment.GetEnvironmentVariable("MSI_SECRET"));
return await client.GetAsync(String.Format("{0}/?resource={1}&api-version={2}", Environment.GetEnvironmentVariable("MSI_ENDPOINT"), resource, apiversion));
}
Я попробую это и посмотрю, какой ответ я получу.
Я обнаружил, что если вы включаете MSI, а затем меняете слот, функциональность уходит с изменением слота. Вы можете снова включить его, выключив и снова включив, но это создаст новый идентификатор в AD и потребует от вас сбросить разрешения для хранилища ключей для его работы.
Я только что решил эту проблему, когда пытался использовать MSI с приложением Function, хотя у меня уже были установлены переменные среды. Я пытался перезагрузить несколько раз, но безуспешно. В итоге я вручную отключил MSI для функции, а затем снова включил ее. Это не было идеальным, но это сработало.
Надеюсь, поможет!
Включите удостоверение и предоставьте доступ своему приложению-функции Azure в хранилище ключей с помощью политики доступа. Вы можете найти идентичность на вкладке функций платформы. Эти два шага подходят мне.
В моем случае я забыл добавить политику доступа для приложения в Key Vault.
Дважды проверьте, заканчивается ли сообщение об ошибке:
Перейдите в Инструменты->Параметры->Аутентификация служб Azure и повторите аутентификацию учетной записи, которую вы хотите использовать.
Для тех, кто, как и я, задается вопросом, как включить MSI
.
Мой сценарий: у меня есть App Service
уже развернут и давно работают. Кроме того, наAzure DevOps
У меня есть Pipeline настроен на Авто-Обмен моего Deployment шлицы (Балетмейстер / производство). Внезапно, после обычного нажатия, производство начинает давать сбой из-за описанной проблемы.
Таким образом, для того, чтобы включить MSI снова (я не знаю, почему он должен быть повторно включен, но я считаю, что это лишь временное решение, а не решение, так как оно должно быть по- прежнему включен в первую очередь)
Перейдите в свою службу приложений. Затем в разделе " Настройки" -> "Личность". Проверить статус: в моем случае он был выключен
Я прикрепил изображение ниже, чтобы было легче следить.
Для людей, которые столкнутся с этими ответами, я хотел бы поделиться своим опытом.
У меня возникла эта проблема с запуском конвейера Azure Synapse. По сути, я правильно добавил политики доступа в KeyVault, а также добавил LinkedService в Azure Synapse, указывающий на мой KeyVault.
Если я запускаю блокнот вручную, он работает, но в конвейере он терпит неудачу.
Первоначально я использовал следующее утверждение:
url = TokenLibrary.getSecret("mykeyvault", "ConnectionString")
Затем я добавил имя связанной службы в качестве третьего параметра, и конвейер смог использовать эту связанную службу для получения токена MSI для хранилища.
url = TokenLibrary.getSecret("mykeyvault", "ConnectionString", "AzureKeyVaultLinkedServiceName")
Возможно, это не связано с вашей проблемой, но я получал то же сообщение об ошибке.
Для меня проблема заключалась в использовании azure-cli pip3. Мне удалось решить эту проблему с помощью пакетов brew как для azure-cli, так и для azure-functions-core-tools.
Удалить pip3 azure-cli
pip3 uninstall azure-cli
Установите brew azure-cli
brew update
brew install azure-cli