Мне нужно получить доступ к хранилищу ключей и Сервисная шина из кода, используя Принцип обслуживания для аутентификации.
Я могу использовать следующий код для доступа к служебной шине, который работает как положено - когда я включаю Принцип обслуживания в Политики доступа Я могу получить список тем:
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 все настроено правильно).
Спасибо за любые советы!