如何使用用户凭据访问Azure Key Vault?

时间:2016-04-27 17:21:17

标签: c# azure azure-keyvault

我尝试使用自己的域加入凭据编写一个简单的应用程序来访问Azure KeyVault。我不知道它是否是凭据部分或我如何访问KeyVault,但我一直得到一个"无效的URI:无法确定URI的格式"例外。 我可以使用Azure PowerShell cmdlet访问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。

4 个答案:

答案 0 :(得分:8)

正如@ varun-puranik所说,你需要指定vaultBaseUrl而不是保险库名称。

有新的nuget包允许连接到Azure Keyvault而不指定Azure Active Directory客户端ID 当您使用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}}");

答案 1 :(得分:5)

VaultName需要是KeyVault的URL,而不仅仅是Vault的名称。 例如,如果KeyVault的名称是TestKeyVault,那么您需要使用以下代码 -

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

其余的代码看起来很好。

答案 2 :(得分:1)

在您的代码中,尝试将您的机密版本作为第三个参数传递。

例如:

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

答案 3 :(得分:1)

使用js,我发现了一个解决方案,其中他们使用节点连接到Azure密钥库并使用clientId,clientSecret等获取信息,这是Link