《Windows Azure Platform 系列文章目录

 

  本章我们介绍如何在Azure Windows VM里面,使用.NET使用Azure Key Vault

  我们需要对Key Vault进行身份验证,所以需要提供凭据。托管服务标识 (MSI) 提供简化该过程的启动标识,可以解决此问题。

  为 Azure 服务(例如 Azure 虚拟机、Azure 应用服务或 Azure Functions)启用 MSI 时,Azure 会创建一个服务主体。 MSI 针对 Azure Active Directory (Azure AD) 中的服务实例提供启动标识,并将服务主体凭据注入该实例。

  Azure Key Vault (3) 在Azure Windows VM里使用Key Vaule
    




Windows Azure Platform 系列文章目录

 

    

  我们需要准备以下内容:

  1.创建一个资源组,命名为:keyvault-rg

  2.创建1个Key Vault,并创建Secret Vaule

  3.创建1台Windows VM,在这台Windows VM安装Visual Studio (这台VM必须与KeyVault在同一个资源组)

  4.安装并运行Azure CLI

az cloud set --name AzureChinaCloud
az login

  5.在弹出的输入框中,输入Azure China的用户名和密码

  6.如果我们有多个订阅,首先需要选择订阅:

az account set --subscription 订阅ID

  7.为VM分配Identity

az vm identity assign --name VMName --resource-group VM所在的资源组名称

  8.执行完毕后,显示的结果如下:

  我们把systemAssignedIdentity后面的信息保存下来

{
  "systemAssignedIdentity": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "userAssignedIdentities": {}
}

  

  9.为VM分配权限

  我们执行下面的命令:

az keyvault set-policy --name VM的名称 --object-id 步骤8中显示的systemAssignedIdentity值 --secret-permissions get list

 

  10.登录到虚拟机,创建1个Windows Console Project。选择NuGet,增加Newtonsoft Package

  11.增加如下的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Net;
using System.IO;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            // Step 1: Get a token from the local (URI) Managed Service Identity endpoint, which in turn fetches it from Azure AD
            var token = GetToken();

            // Step 2: Fetch the secret value from your key vault
            System.Console.WriteLine(FetchSecretValueFromKeyVault(token));
        }

        static string GetToken()
        {
            //169.254.169.254是Azure Instance Metadata service endpoint
            WebRequest request = WebRequest.Create("http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://vault.azure.cn");
            request.Headers.Add("Metadata", "true");
            WebResponse response = request.GetResponse();
            return ParseWebResponse(response, "access_token");
        }

        static string FetchSecretValueFromKeyVault(string token)
        {
            //这里需要修改两个部分:
            //你的KeyVault名称
            //你的SecretName

            WebRequest kvRequest = WebRequest.Create("https://你的KeyVault名称.vault.azure.cn/secrets/你的SecretName?api-version=2016-10-01");
            kvRequest.Headers.Add("Authorization", "Bearer " + token);
            WebResponse kvResponse = kvRequest.GetResponse();
            return ParseWebResponse(kvResponse, "value");
        }

        private static string ParseWebResponse(WebResponse response, string tokenName)
        {
            string token = String.Empty;
            using (Stream stream = response.GetResponseStream())
            {
                StreamReader reader = new StreamReader(stream, Encoding.UTF8);
                String responseString = reader.ReadToEnd();

                JObject joResponse = JObject.Parse(responseString);
                JValue ojObject = (JValue)joResponse[tokenName];
                token = ojObject.Value.ToString();
            }
            return token;
        }
    }
}

 

  12.运行完毕后,我们就可以在Azure VM里面显示Key Vault里面Secret的值

  Azure Key Vault (3) 在Azure Windows VM里使用Key Vaule
    




Windows Azure Platform 系列文章目录

 

相关文章: