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