本文介绍:

使用服务主体和机密访问(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();

        }
    }
}