Использовать KeyVaultClient с токеном MSAL «Несанкционированный» - PullRequest
1 голос
/ 04 апреля 2019

Как приложение для настольных компьютеров может использовать Azure AD для чтения секретов KeyVault?

Я могу приобрести токен MSAL, но передача его KeyVaultClient всегда приводит к:

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

Я даже не уверен, что KeyVault поддерживает этот вид токена, но в моем поиске я видел примеры старыхИспользуемые токены ADAL.

У моего KeyVault есть политики доступа как для моей учетной записи Azure AD, так и для группы, членом которой я являюсь.

Полезная нагрузка токена JWT, который я получил от MSAL, имеетэти области:

"scp": "User.Read profile openid email"

Вот mcve:

public partial class MainWindow : Window
{
    private static string ClientId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
    public static PublicClientApplication PublicClientApp = new PublicClientApplication(ClientId);

    public MainWindow()
    {
        InitializeComponent();
    }

    private async void Button_Click(object sender, RoutedEventArgs e)
    {
        var secret = await GetKeyVaultSecret("TestSecret");
    }

    private async Task<string> GetKeyVaultSecret(string secretKey)
    {
        KeyVaultClient kvClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(AcquireMSALToken));

        try
        {
            var secretBundle = 
                await kvClient.GetSecretAsync("https://xxxxx.vault.azure.net/", 
                    secretKey, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");

            return secretBundle.Value;
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
            return null;
        }
    }

    private static async Task<string> AcquireMSALToken(string authority, string resource, string scope)
    {
        string[] _scopes = new string[] { "user.read" };

        AuthenticationResult authResult = null;
        var app = PublicClientApp;
        var accounts = await app.GetAccountsAsync();

        try
        {
            authResult = await app.AcquireTokenSilentAsync(_scopes, accounts.FirstOrDefault());
            return authResult.AccessToken;
        }
        catch (MsalUiRequiredException)
        {
            try
            {
                authResult = await PublicClientApp.AcquireTokenAsync(_scopes);
                return authResult.AccessToken;
            }
            catch (MsalException) { throw; }
        }
        catch (Exception) { throw; }
    }
}

ОБНОВЛЕНИЕ

К вашему сведению, это работает, но я не думаю, что этоэто то, для чего предназначен AzureServiceTokenProvider на основе документов.Это заставляет меня поверить, что токен MSAL не совместим с KeyVault.Мне кажется, он используется только для вызовов MS Graph.

using Microsoft.Azure.Services.AppAuthentication;

AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
var kvClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));


var secretBundle =  await kvClient.GetSecretAsync("https://xxxxxxxx.vault.azure.net/",
                    "TestSecret", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx");

return secretBundle.Value;

1 Ответ

3 голосов
/ 08 апреля 2019

Области не подходят для доступа к хранилищу ключей Azure.Вы должны использовать

string[] _scopes = new string[] { "https://vault.azure.net/.default" };

Вы можете добавлять определенные разрешения по своему усмотрению.

Обычно вам необходимо полностью определить каждую область, но MS Graph API - это особый случай.Он позволяет использовать «короткую форму», например {user.read}.

. Вы можете выполнить следующие действия, чтобы предоставить разрешения приложению.

1.Нажмите «Регистрация приложений (предварительный просмотр) -> Нажмите».приложение, которое вы зарегистрировали.

enter image description here

2.Щелкните разрешения API-> нажмите добавить разрешение.

enter image description here

3.Выберите хранилище ключей Azure.

enter image description here

4.Щелкните разрешение администратора в нижней части страницы разрешений API.

enter image description here

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