ドメインに参加している自分の資格情報を使用してAzure KeyVaultにアクセスする簡単なアプリケーションを作成しようとしています。資格情報の部分なのか、KeyVaultへのアクセス方法がわからないのですが、「無効なURI:URIの形式を判別できませんでした」という例外が発生し続けます。 Azure PowerShellコマンドレットを使用してKeyVaultにアクセスできますが、C#を使用できません。
これが私が持っているコードです:
class Program
{
const string ClientId = "MY AAD CLIENT ID";
static void Main(string[] args)
{
Console.WriteLine("Hello, KeyVault!");
var client = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(GetAccessToken));
var secret = client.GetSecretAsync("vaultName", "secretName").Result; // Throws Invalid URI: The format of the URI could not be determined
Console.WriteLine(secret.Value);
Console.ReadLine();
}
private static async Task<string> GetAccessToken(string authority, string resource, string scope)
{
var context = new AuthenticationContext(authority, TokenCache.DefaultShared);
var authResult = await context.AcquireTokenAsync(resource, ClientId, new UserCredential());
return authResult.AccessToken;
}
}
何が原因でしょうか?私はインターネットを調べましたが、この方法でKeyVaultにアクセスする方法を示すサンプルコードは見つかりませんでした。
@ varun-puranikが言ったように、ボールト名ではなくvaultBaseUrl
を指定する必要はありません。
Azure Active DirectoryクライアントIDを指定せずに Azure Keyvault に接続できる新しいnugetパッケージがあります。
managed identity を使用している場合、このアプローチは機能します
Microsoft.Azure.KeyVault nugetパッケージもインストールする必要があります。
using Microsoft.Azure.KeyVault;
using Microsoft.Azure.Services.AppAuthentication;
...
var azureServiceTokenProvider = new AzureServiceTokenProvider();
var keyVaultClient = new KeyVaultClient(
new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
var secret = await keyVaultClient.GetSecretAsync(
"https://{{my-vault-name}}.vault.Azure.net/", "{{my-secret}}");
VaultNameは、Vaultの名前だけでなく、KeyVaultのURLである必要があります。たとえば、KeyVaultの名前がTestKeyVaultの場合、次のコードを使用する必要があります-
var secret = client.GetSecretAsync("https://testkeyvault.vault.Azure.net:443", "secretName").Result;
コードの残りの部分は正常に見えます。
コードで、3番目のパラメータとしてシークレットのバージョンを渡してみてください。
例えば:
var secret = client.GetSecretAsync("vaultName", "secretName", "secretVersion").Result;