我尝试使用自己的域加入凭据编写一个简单的应用程序来访问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。
答案 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