Azure - проверка подлинности в KeyVault с использованием Service Principle возвращает несанкционированное исключение - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь получить доступ к KeyVault из консольного приложения .net Core, используя принцип обслуживания (у меня есть App Id и App Secret ). Вот мой код:

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 ". Изменение кода для использования этого обратного вызова приводит к исключению " Unauthorized ":

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 ]

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

Я тестирую его с помощью следующего кода, он корректно работает на моей стороне. Значение ресурса: https://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» в зарегистрированное приложение. enter image description here

В канале Key vault вам необходимо добавить политики в ваше зарегистрированное приложение или пользователя. А в Access Control вам нужно добавить разрешение для вашего зарегистрированного приложения или пользователя. enter image description here enter image description here

Вывод: enter image description here

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

«Контроль доступа (IAM)» контролирует доступ к самому хранилищу. Существует отдельный способ управления доступом к содержимому хранилищ (т. Е. Ключи, секреты и сертификаты). Как упоминалось в этих документах , мы можем разрешить данному приложению AAD получать секреты в указанном хранилище на портале Azure, перейдя к нужному хранилищу, выбрав «Политики доступа», нажав «Добавить новый», а затем в поиске вашего принципала службы. Вы должны быть в состоянии фильтровать по идентификатору приложения:

enter image description here enter image description here

...