本文介绍:
使用服务主体和机密访问(Service principal and secret)访问key vault
官网中对Key vault的授权方式介绍:https://docs.microsoft.com/zh-cn/azure/key-vault/general/basic-concepts
本视频中用到的SDK介绍页面:https://azuresdkdocs.blob.core.windows.net/$web/dotnet/Azure.Identity/1.5.0/api/index.html
本文介绍第三种方式,服务主体和机密的方式。
若要使用密钥保管库执行任何操作,首先需要向其进行身份验证。 可通过三种方式向密钥保管库进行身份验证:
- Azure 资源的托管标识:在 Azure 中的虚拟机上部署应用时,可以为虚拟机分配具有密钥保管库访问权限的标识。 还可以将标识分配给其他 Azure 资源。 这种方法的好处在于应用或服务不管理第一个机密的轮换。 Azure 会自动轮换标识。 我们将此方法作为最佳做法推荐。
- 服务主体和证书:可以使用服务主体和具有密钥保管库访问权限的关联证书。 我们不建议使用此方法,因为应用程序所有者或开发人员必须轮换证书。
- 服务主体和机密:尽管可以使用服务主体和机密向密钥保管库进行身份验证,但我们不建议你这样做。 自动轮换用于向密钥保管库进行身份验证的启动机密非常困难。
本文演示视频:
using System;
using Azure.Core;
using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
using Microsoft.Identity.Client;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
string secretName = "db-connstring";
string keyVaultName = "sean-key-vault-01";
var kvUri = "https://sean-key-vault-01.vault.azure.net/";
SecretClientOptions options = new SecretClientOptions()
{
Retry =
{
Delay= TimeSpan.FromSeconds(2),
MaxDelay = TimeSpan.FromSeconds(16),
MaxRetries = 5,
Mode = RetryMode.Exponential
}
};
string clientId = "xxxxxxx";
string aadTenantId = "xxxxxxx";
string clientSecretKey = "xxxxxxx";
ClientSecretCredential clientSecretCredential = new ClientSecretCredential(aadTenantId, clientId, clientSecretKey);
var client = new SecretClient(new Uri(kvUri), clientSecretCredential, options);
//Console.Write("Input the value of your secret > ");
//string secretValue = Console.ReadLine();
//Console.Write("Creating a secret in " + keyVaultName + " called '" + secretName + "' with the value '" + secretValue + "` ...");
//client.SetSecret(secretName, secretValue);
//Console.WriteLine(" done.");
//Console.WriteLine("Forgetting your secret.");
//secretValue = "";
//Console.WriteLine("Your secret is '" + secretValue + "'.");
//Console.WriteLine("Retrieving your secret from " + keyVaultName + ".");
KeyVaultSecret secret = client.GetSecret(secretName);
Console.WriteLine("Your secret is '" + secret.Value + "'.");
//Console.Write("Deleting your secret from " + keyVaultName + " ...");
//client.StartDeleteSecret(secretName);
System.Threading.Thread.Sleep(5000);
Console.WriteLine(" done.");
Console.ReadLine();
}
}
}