Проверка подлинности для нескольких служб Azure с использованием принципа службы (.net Core) - PullRequest
0 голосов
/ 29 августа 2018

Мне нужно получить доступ к хранилищу ключей и Сервисная шина из кода, используя Принцип обслуживания для аутентификации.

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

var credentials = SdkContext.AzureCredentialsFactory.FromServicePrincipal(APPID, APPSECRET, TENANTID, AzureEnvironment.AzureGlobalCloud);

var serviceBusManager = ServiceBusManager.Authenticate(credentials, SUBSCRIPTIONID);
var serviceBusNamespace = serviceBusManager.Namespaces.List().SingleOrDefault(n => n.Name == "SERVICEBUSNAMESPACE");
var topics = serviceBusNamespace.Topics.ListAsync().GetAwaiter().GetResult();

Однако мне также нужно получить некоторую информацию из хранилища ключей, и я пытался найти общий способ аутентификации.

МЕТОД 1

Как и выше, я попробовал этот код для доступа к KeyVault:

var credentials = SdkContext.AzureCredentialsFactory.FromServicePrincipal(APPID, APPSECRET, TENANTID, AzureEnvironment.AzureGlobalCloud);

var kvManager = new KeyVaultClient(credentials);
var secret = kvManager.GetSecretAsync("https://VAULTNAMESPACE.vault.azure.net", "SECRETNAME").GetAwaiter().GetResult().Value;

Я получаю следующую ошибку:

Microsoft.Azure.KeyVault.Models.KeyVaultErrorException: 'Операция вернул недействительный код состояния «Не авторизован»

МЕТОД 2

Этот код работает для Key Vault, однако (показывая, что у меня есть правильные разрешения):

string GetSecret()
{
     var client = new KeyVaultClient(GetAccessToken);
     var secret = client.GetSecretAsync("https://VAULTNAMESPACE.vault.azure.net", "SECRETNAME").GetAwaiter().GetResult();
     return secret;
}

private static async Task<string> GetAccessToken(string authority, string resource, string scope)
{
     var context = new AuthenticationContext("https://login.windows.net/" + tenantId);
     var credential = new ClientCredential(appId, appSecret);
     var tokenResult = await context.AcquireTokenAsync("https://vault.azure.net", credential);
     return tokenResult.AccessToken;
}

Но, опять же, это очень специфичный для KeyVault способ аутентификации, и я надеялся создать общий механизм с использованием SdkContext.AzureCredentialsFactory . Любая причина, по которой я получаю исключение Несанкционированный с кодом выше для подключения к хранилищу ключей? (в Azure все настроено правильно).

Спасибо за любые советы!

1 Ответ

0 голосов
/ 29 августа 2018

Когда вы используете SdkContext.AzureCredentialsFactory.FromServicePrincipal для аутентификации, он будет использовать https://management.azure.com/ в качестве ресурса Uri.

Хотя Azure Key Vault имеет собственную систему авторизации, а его URI ресурса равен https://vault.azure.net, вы можете получить сообщение об ошибке Unauthorized.

Таким образом, вы можете использовать Method2, чтобы получить доступ к хранилищу ключей Azure с правым URI ресурса.

Для получения более подробной информации вы можете обратиться к этой статье .

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