Как получить токен для управляемой идентификации Azure через интерфейс REST?

Этот вопрос относится к статье:

https://docs.microsoft.com/en-us/azure/app-service/app-service-managed-service-identity

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

Я следил за статьей, и когда я развертываю функцию azure в Azure и запускаю ее оттуда, я могу успешно использовать MSI_ENDPOINT и MSI_SECRET для успешного получения токена. Однако когда я запускаю то же развертывание локально, это не удается. Я использую тот же самый MSI_SECRET и меняю MSI_ENDPOINT на домен, который я использую для конечной точки функции Azure.

Пример: на лазурном сервере MSI_ENDPOINT = http://127.0.0.1:41831, а локально это http://localhost:7071 (http://0.0.0.0:7071

Однако, когда я запускаю его локально, я получаю ошибку 404 с запросом. Запрос: http://0.0.0.0:7071/MSI/token?resource=https://vault.azure.net&api-version=2017-09-01 с секретом в заголовке. Точно такие же параметры с рабочим, загруженным на Azure, за исключением MSI_ENDPOINT.

Есть какие-нибудь советы о том, как решить эту проблему, чтобы я мог запускать и тестировать локально?

Используя библиотеку Microsoft.Azure.Services.AppAuthentication для .NET для приложений и функций .NET, самый простой способ работы с управляемым удостоверением - через пакет Microsoft.Azure.Services.AppAuthentication. Эта библиотека также позволит вам тестировать свой код локально на вашем компьютере разработки, используя вашу учетную запись пользователя из Visual Studio, Azure CLI или встроенной аутентификации Active Directory. Дополнительные сведения о вариантах локальной разработки с помощью этой библиотеки см. В справочнике Microsoft.Azure.Services.AppAuthentication. В этом разделе показано, как начать работу с библиотекой в ​​вашем коде. Добавьте в свое приложение ссылки на пакеты NuGet Microsoft.Azure.Services.AppAuthentication и Microsoft.Azure.KeyVault.

Однако эта библиотека доступна только в .net, которую я не использую, и на самом деле не объясняет, как это сделать с помощью вызова REST.

Спасибо!


person darewreck    schedule 06.10.2018    source источник


Ответы (1)


Насколько я понимаю, MSI через REST у вас работает в облаке, но не локально.

К сожалению, в настоящее время это сделать нелегко, если вы не можете использовать библиотеку AppAuthentication. См. это предложение GitHub.

Поэтому, если вы не хотите использовать какой-то отладочный код в своем производственном коде, вам, вероятно, потребуется локально разместить «настраиваемый прокси-сервер MSI», который просто выполняет классическую аутентификацию через учетные данные клиента (appId + secret) для возврата токена.

curl -d "grant_type=client_credentials&client_id=<removed_for_security>&client_secret=<removed_for_security>&resource=https%3A%2F%2Fvault.azure.net" https://login.microsoftonline.com/<removed_for_security>/oauth2/token

Обратите внимание, что я добавил KeyVault в качестве параметра ресурса. См. Свой созданный URL-адрес MSI - http://0.0.0.0:7071/MSI/token?resource=https://vault.azure.net&api-version=2017-09-01

person Alex AIT    schedule 06.10.2018
comment
Спасибо, Алекс, но в данном случае я использую лазурную функцию. Каким будет client_id или даже идентификатор приложения, поскольку я использую план потребления, и он привязан к любому приложению. - person darewreck; 06.10.2018
comment
Это должен быть идентификатор вашего субъекта-службы (guid). - person Alex AIT; 06.10.2018
comment
с функциями azure единственный способ получить принципала службы - это распечатать MSI_SECRET, поскольку для его включения достаточно просто переключить кнопку-переключатель в настройках функции azure. Однако, раз уж эта система определена, изменится ли она? Брать ключ таким способом кажется неточным. Есть ли какие-либо предложения о том, как правильно получить секретный ключ службы для функций Azure? - person darewreck; 07.10.2018
comment
При попытке получить следующую ошибку: приложение с идентификатором ‹principalId› не было найдено в каталоге ‹tenantId›. Это может произойти, если приложение не было установлено администратором клиента или с согласия какого-либо пользователя в клиенте. В этом случае я взял tenantId и PrincipalId из свойства функции azure - ›функция платформы -› проводник ресурсов, есть раздел под названием identity, где is (type, tenandid, PrincipalId). - person darewreck; 08.10.2018