Нам нужно запустить приложения, обращающиеся к 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 существует библиотека, которая мы пропустили.