zoukankan      html  css  js  c++  java
  • Azure Key Vault (3) 在Azure Windows VM里使用Key Vaule

      《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) 中的服务实例提供启动标识,并将服务主体凭据注入该实例。

      

        

      我们需要准备以下内容:

      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的值

      

  • 相关阅读:
    Hbase架构与原理(转)
    Hbase的表结构中rowkey的设计---避免热点问题
    mysql之my.cnf详解
    MongoDB CPU利用率很高,怎么破(转)
    数据库设计(2/9):域,约束和默认值(Domains, Constraints and Defaults)
    数据库设计(1/9):数据元(Data Elements)
    SQL Server安全(11/11):审核(Auditing)
    VARCHAR列上的索引
    SQL Server 2016里的sys.dm_exec_input_buffer
    在SQL Server里禁用聚集索引——真的好么?
  • 原文地址:https://www.cnblogs.com/threestone/p/10967619.html
Copyright © 2011-2022 走看看