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, перейдя к нужному хранилищу, выбрав "Политики доступа", нажав "Добавить новое", а затем выполнив поиск вашей службы. главный. Вы должны быть в состоянии фильтровать по идентификатору приложения:

введите описание изображения здесь введите описание изображения здесь

Другие вопросы по тегам