Azure Аутентификация служебной шины с назначенными пользователем управляемыми удостоверениями - PullRequest
1 голос
/ 24 февраля 2020

Нам нужно запустить приложения, обращающиеся к Azure Service Bus (ASB) из Azure Служб приложений и Azure Функции. Нам нужно авторизоваться, используя назначенные пользователем идентификационные данные. Мы пишем следующий код, который работает с системными идентификационными данными, но не с пользовательскими идентификационными данными:

var tokenProvider = TokenProvider.CreateManagedIdentityTokenProvider();
var managementClient = new ManagementClient(serviceBusEndpoint, tokenProvider);

if(await managementClient.QueueExistsAsync(queueName))
{
    return new OkObjectResult($"Queue with name {queueName} exists.");
}
else
{
    return new OkObjectResult($"Queue with name {queueName} doesn't exist.");
}

Выдается эта ошибка:

Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProviderException: Parameters: Connection String: [No connection string specified], Resource: https://servicebus.azure.net/, Authority: . Exception Message: Tried the following 3 methods to get an access token, but none of them worked.
Parameters: Connection String: [No connection string specified], Resource: https://servicebus.azure.net/, Authority: . Exception Message: Tried to get token using Managed Service Identity. Access token could not be acquired. MSI ResponseCode: BadRequest, Response: {"StatusCode":400,"Message":"No MSI found for specified ClientId/ResourceId.","CorrelationId":"dd2bcf6c-6f1d-489e-b178-ca6007502841"}
Parameters: Connection String: [No connection string specified], Resource: https://servicebus.azure.net/, Authority: . Exception Message: Tried to get token using Visual Studio. Access token could not be acquired. Visual Studio Token provider file not found at "D:\local\LocalAppData\.IdentityService\AzureServiceAuth\tokenprovider.json"
Parameters: Connection String: [No connection string specified], Resource: https://servicebus.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,
operable program or batch file.


   at Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProvider.GetAccessTokenAsyncImpl(String authority, String resource, String scope)
   at Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProvider.GetAccessTokenAsync(String resource, String tenantId)
   at Microsoft.Azure.ServiceBus.Primitives.ManagedIdentityTokenProvider.GetTokenAsync(String appliesTo, TimeSpan timeout)
   at Microsoft.Azure.ServiceBus.Management.ManagementClient.GetToken(String requestUri)
   at Microsoft.Azure.ServiceBus.Management.ManagementClient.SendHttpRequest(HttpRequestMessage request, CancellationToken cancellationToken)
   at Microsoft.Azure.ServiceBus.Management.ManagementClient.GetEntity(String path, String query, Boolean enrich, CancellationToken cancellationToken)
   at Microsoft.Azure.ServiceBus.Management.ManagementClient.GetQueueAsync(String queuePath, CancellationToken cancellationToken)
   at Microsoft.Azure.ServiceBus.Management.ManagementClient.QueueExistsAsync(String queuePath, CancellationToken cancellationToken)

Таким образом, ошибка ядра No MSI found for specified ClientId/ResourceId.. Похоже, нам нужно указать идентификатор клиента. Затем мы нашли https://github.com/Azure/azure-sdk-for-net/tree/master/sdk/identity/Azure.Identity с ManagedIdentityCredential, где мы можем указать идентификатор клиента, но еще не выяснили, как использовать его для ASB.

Другой вариант - использовать HTTP-запрос GET к MSI_ENDPOINT, как описано здесь https://docs.microsoft.com/en-us/azure/app-service/overview-managed-identity?context=azure%2Factive-directory%2Fmanaged-identities-azure-resources%2Fcontext%2Fmsi-context&tabs=dotnet#obtaining -tokens-for- azure -resources , но может быть реально работающим. net существует библиотека, которая мы пропустили.

Ответы [ 3 ]

2 голосов
/ 25 февраля 2020

Я в команде Azure SDK. Мы находимся в процессе объединения всех Azure SDK здесь: https://aka.ms/azsdkpackages, но у нас пока нет нового SDK служебной шины.

Я не пытался назначить идентификаторы, назначенные пользователем с API TokenProvider, но я знаю, что он работает с новым объектом DefaultAzureCredential, который будет искать кредиты в вашей среде и автоматически выбирает конечные точки управляемой идентификации. Вы можете прочитать больше об этом здесь: https://docs.microsoft.com/en-us/dotnet/api/azure.identity.defaultazurecredential?view=azure-dotnet

Однако вы не можете использовать DefaultAzureCredential напрямую, потому что ServiceBus принимает ITokenProvider.

Тем временем вы можете использовать это Адаптер, который я создал, - это всего лишь временная задержка, пока у нас не будет SDK служебной шины.

  1. Добавьте в ваш проект пакеты с нативами Azure .Identity и Azure .Core.

  2. Скопируйте этот файл в свой проект: https://github.com/jongio/azidext/blob/master/net/JonGallant.Azure.Identity.Extensions/DefaultAzureServiceBusCredential.cs

  3. Вот пример использования https://github.com/jongio/azidext/blob/master/net/JonGallant.Azure.Identity.Extensions.Tests/ServiceBus/ServiceBusTests.cs

Вы можете установить идентификатор клиента, секрет и идентификатор клиента со следующими переменными среды:

AZURE_CLIENT_ID

AZURE_CLIENT_SECRET

AZURE_TENANT_ID

Если вам нужно использовать TokenProvider и не хотите использовать временную пробел, тогда, пожалуйста, дайте мне знать, и я могу исследовать это дальше.

1 голос
/ 26 февраля 2020

TokenProvider.CreateManagedIdentityTokenProvider зависит от Microsoft. Azure .Services.AppAuthentication для реализации управляемой идентификации.

Назначенная пользователем управляемая идентификация поддерживается в версии 1.2.1 Microsoft. Azure .Services.AppAuthentication. Документацию можно найти здесь .

Итак, вам нужно сделать две вещи , чтобы заставить эту работу работать с уже имеющимся у вас кодом:

1. Обновите версию Microsoft. Azure .Services .AppAuthentication до последней

2.Set AzureServicesAuthConnectionString в настройках приложения AppService для RunAs = App; AppId = {ClientId назначенного пользователем удостоверения}. например, RunAs = App; AppId = 587f16c8-81ed-41c7-b19a-9ded0dbe2ca2

После того, как вы выполните эти два шага, ваш код должен использовать назначенный пользователем управляемый идентификатор. Я попробовал это со службой приложений, она работала нормально для меня.

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

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

var managedCredential = new ManagedIdentityCredential(userAssignedIdentityAppId);
var accessToken = await _managedCredential.GetTokenAsync(
                        new TokenRequestContext(
                            new[] { "https://servicebus.azure.net" })).ConfigureAwait(false);

Он также работает с "https://servicebus.azure.net/.default".

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