Как приложение для настольных компьютеров может использовать 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;