Azure - проверка подлинности в KeyVault с использованием Service Principle возвращает несанкционированное исключение
Я пытаюсь получить доступ к KeyVault из консольного приложения.net Core, используя принцип обслуживания (у меня есть идентификатор приложения и секрет приложения). Вот мой код:
var client = new KeyVaultClient(GetAccessToken);
var secret = client.GetSecretAsync("https://{keyvaultName}.vault.azure.net", "MySecret").Result;
Который вызывает эту функцию:
private static async Task<string> GetAccessToken(string authority, string resource, string scope)
{
var context = new AuthenticationContext(authority, TokenCache.DefaultShared);
var credential = new ClientCredential(clientId: appId, clientSecret: appSecret);
var authResult = await context.AcquireTokenAsync(resource, credential);
return authResult.AccessToken;
}
Вызов GetSecretAsync возвращает исключение "AccessDenied". Изменение кода для использования этого обратного вызова приводит к исключению "Несанкционированный":
private static async Task<string> GetAccessToken(string authority, string resource, string scope)
{
var context = new AuthenticationContext(authority, TokenCache.DefaultShared);
var credential = new ClientCredential(clientId: appId, clientSecret: appSecret);
**var authResult = await context.AcquireTokenAsync("https://management.core.windows.net/", credential);**
return authResult.AccessToken;
}
Я установил Принцип обслуживания, перейдя в Azure > AAD > Регистрация приложений, отметил Идентификатор приложения и пароль (App Secret) при настройке Принципа.
Затем в KeyVault я добавил принцип контроля доступа (IAM) с правами участника, но все равно не радует!
Кто-нибудь сталкивался с таким сценарием раньше?
Спасибо!:)
2 ответа
Я проверяю его с помощью следующего кода, он работает правильно на моей стороне. Ресурс Urihttps://vault.azure.net
,
static string appId = "xxxxxxxxxxxxx";
static string appSecret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxx";
static string tenantId = "xxxxxxxxxxxxxxxxxxxxx";
public static void Main(string[] args)
{
var kv = new KeyVaultClient(GetAccessToken);
var scret = kv.GetSecretAsync("https://xxxxxx.vault.azure.net", "secretname").GetAwaiter().GetResult();
}
public static async Task<string> GetAccessToken(string azureTenantId, string clientId, string redirectUri)
{
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;
}
Кроме того, вам нужно добавить разрешение с "Key Vault" для зарегистрированного приложения.
В канале Key vault вам необходимо добавить политики в ваше зарегистрированное приложение или пользователя. А в Access Control вам нужно добавить разрешение для вашего зарегистрированного приложения или пользователя.
"Контроль доступа (IAM)" контролирует доступ к самому хранилищу. Существует отдельный способ управления доступом к содержимому хранилищ (т. Е. Ключам, секретам и сертификатам). Как упоминалось в этих документах, мы можем разрешить данному приложению AAD получать секреты в указанном хранилище на портале Azure, перейдя к нужному хранилищу, выбрав "Политики доступа", нажав "Добавить новое", а затем выполнив поиск вашей службы. главный. Вы должны быть в состоянии фильтровать по идентификатору приложения: