web-dev-qa-db-ja.com

ユーザー資格情報を使用してAzure Key Vaultにアクセスするにはどうすればよいですか?

ドメインに参加している自分の資格情報を使用して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にアクセスする方法を示すサンプルコードは見つかりませんでした。

9
Bonz0

@ 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}}");
9
Thomas

VaultNameは、Vaultの名前だけでなく、KeyVaultのURLである必要があります。たとえば、KeyVaultの名前がTestKeyVaultの場合、次のコードを使用する必要があります-

var secret = client.GetSecretAsync("https://testkeyvault.vault.Azure.net:443", "secretName").Result;

コードの残りの部分は正常に見えます。

5
Varun Puranik

コードで、3番目のパラメータとしてシークレットのバージョンを渡してみてください。

例えば:

var secret = client.GetSecretAsync("vaultName", "secretName", "secretVersion").Result;
1
Manish Kumar