Azure Key Vault (3) 在Azure Windows VM裏使用Key Vaule Windows Azure Platform 系列文章目錄

  《Windows Azure Platform 系列文章目錄html

 

  本章咱們介紹如何在Azure Windows VM裏面,使用.NET使用Azure Key Vaultapi

  咱們須要對Key Vault進行身份驗證,因此須要提供憑據。所以,在啓動過程當中,這是一個難以兼顧的典型問題。 託管服務標識 (MSI) 提供簡化該過程的啓動標識,能夠解決此問題。ide

  爲 Azure 服務(例如 Azure 虛擬機、Azure 應用服務或 Azure Functions)啓用 MSI 時,Azure 會建立一個服務主體。 MSI 針對 Azure Active Directory (Azure AD) 中的服務實例提供啓動標識,並將服務主體憑據注入該實例。post

  

 

    

  咱們須要準備如下內容:fetch

  1.建立一個資源組,命名爲:keyvault-rgurl

  2.建立1個Key Vault,並建立Secret Vaulespa

  3.建立1臺Windows VM,在這臺Windows VM安裝Visual Studio (這臺VM必須與KeyVault在同一個資源組)code

  4.安裝並運行Azure CLIorm

az cloud set --name AzureChinaCloud
az login

  5.在彈出的輸入框中,輸入Azure China的用戶名和密碼htm

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

  

相關文章
相關標籤/搜索