一,引言
上一篇文章,我們介紹了 Azure Key Vault 在實際專案中的用途,Azure Key Vault 作為金鑰管理的服務,我們可以很輕鬆的利用它建立和控制用於加密的金鑰,和管理證書和機密資訊。而且對於我們開發者來說,我們的應用程式中完全可以摒棄配置這種金鑰和機密資訊,不再需要將這些機密資訊作為程式碼的一部分了。我們只需要在應用程式中配置 Azure Key Vault URL,再為身份驗證配置適當的訪問許可權,應用程式就可以很輕鬆的訪問 Azure Key Vault(金鑰保管庫)了。
今天我們分析的內容是在 .NET Core Web 專案新增了 “Microsoft.Azure.KeyVault” 的引言,並且當前 nuget 也被替代了,但是也不影響我們正常的使用。
nuget 地址:https://www.nuget.org/packages/Microsoft.Azure.KeyVault/3.0.5
-------------------- 我是分割線 --------------------
1,Azure Kay Vault(一).NET Core Console App 獲取金鑰保管庫中的機密資訊
2,Azure Key Vault(二)- 入門簡介
3,Azure KeyVault(三)通過 Microsoft.Azure.KeyVault 類庫在 .NET Core 上獲取 Secrets
二,正文
1,準備 Azure Key Vault ----- Secrets
登入Azure Portal,在建立好的 Azure Key Vault 建立 Secret
cnbate-name:“Blog”
cnbate-num:"10"
cnbate-time:"2022-02-19 23:17"
2,配置專案執行的環境變數和訪問許可權
接下來,需要將之前在Azure上註冊的服務主體的 AZURE_CLIENT_ID(應用程式ID),AZURE_CLIENT_SECRET(客戶端密碼),AZURE_TENANT_ID(租戶ID)配置到系統的環境變數中去,或者是VS執行環境中,大家可以自行進行選擇,我這裡是直接配置在系統的環境變數中。
大家可以參考: Azure Kay Vault(一).NET Core Console App 獲取金鑰保管庫中的機密資訊
3,引入專案依賴包 ----- “Microsoft.Azure.KeyVault”
要使用 Azure Key Vault,我們就需要安裝一下軟體包
建立新的 .NET Core Web 專案,引入 “Microsoft.Azure.KeyVault”,以及其他三個輔助類庫 “Azure.Extensions.AspNetCore.Configuration.Secrets”,"Azure.Identity",“Microsoft.Extensions.Configuration.AzureKeyVault”
使用程式包管理器控制檯進行安裝
Microsoft.Azure.KeyVault
Install-Package Microsoft.Azure.KeyVault -Version 3.0.5
Microsoft.Extensions.Configuration.AzureKeyVault
Install-Package Microsoft.Extensions.Configuration.AzureKeyVault -Version 3.1.22
Azure.Extensions.AspNetCore.Configuration.Secrets
Install-Package Azure.Extensions.AspNetCore.Configuration.Secrets -Version 1.2.1
Azure.Identity
Install-Package Azure.Identity -Version 1.5.0
3,配置 .NET Core 應用程式能夠訪問 Azure Key Vault
應用程式配置連線到 Azure Key Vault 時,它會被新增為單獨的配置源。我們可以像讀取任何其他配置資料一樣讀取值。
KeyVaultService.cs
public class KeyVaultService: IKeyVaultService { private readonly IConfiguration _configuration; public KeyVaultService(IConfiguration configuration) { this._configuration = configuration; } public Task<string> GetSecretByKeyAsync(string keyName) { return Task.FromResult(_configuration[keyName]); } }
IKeyVaultService.cs
public interface IKeyVaultService { Task<string> GetSecretByKeyAsync(string keyName); }
修改 HostBuilder 的邏輯新增將 Azure Key Vault 程式碼新增到應用程式配置的 ConfigureAppConfiguration() 方法
Proram.cs 啟動程式中配置擴充套件方法
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .AddConfigureSetup() .ConfigureWebHostDefaults(webBuilder => { webBuilder .UseUrls("http://*:9004") .UseStartup<Startup>(); });
ConfigureSetup.cs
public static IHostBuilder AddConfigureSetup(this IHostBuilder host) { if (host == null) throw new ArgumentNullException(nameof(host)); return host.ConfigureAppConfiguration((context, config) => { string Path = $"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json"; //這樣的話,可以直接讀目錄裡的json檔案,而不是 bin 資料夾下的,所以不用修改複製屬性 var settings =config.SetBasePath(context.HostingEnvironment.ContentRootPath) .Add(new JsonConfigurationSource { Path = Path, Optional = false, ReloadOnChange = true }).Build(); /* * Method one configuration["StorageConnectionString"] * */ var credential = new DefaultAzureCredential(); config.AddAzureKeyVault(new Uri(settings["AzureKeyVault:Endpoint"]), credential); }); }
將 Azure Key Vault 的連結配置 URL 儲存在 appsettings.json 中
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "AzureKeyVault": { "Endpoint": "https://cnbateblogweb-kv.vault.azure.net/" } }
Startup.cs ----- 依賴注入中新增 KeyVaultService 服務
public void ConfigureServices(IServiceCollection services) { services.AddScoped<IKeyVaultService, KeyVaultService>(); services.AddControllersWithViews(); }
4,.NET Core 控制器和檢視獲取&展示機密資訊
HomeController.cs
public class HomeController : Controller { private readonly ILogger<HomeController> _logger; private readonly IKeyVaultService _keyVaultService; public HomeController(ILogger<HomeController> logger, IKeyVaultService keyVaultService) { _logger = logger; _keyVaultService = keyVaultService; } public async Task<IActionResult> Index() { var list = new List<KeyValueViewModel>(); list.Add(new KeyValueViewModel() { Key ="cnbate-name", Value = await _keyVaultService.GetSecretByKeyAsync("cnbate-name") }); list.Add(new KeyValueViewModel() { Key = "cnbate-num", Value = await _keyVaultService.GetSecretByKeyAsync("cnbate-num") }); list.Add(new KeyValueViewModel() { Key = "cnbate-time", Value = await _keyVaultService.GetSecretByKeyAsync("cnbate-time") }); return View(list); } public IActionResult Privacy() { return View(); } [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] public IActionResult Error() { return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier }); } }
Index.cshtml
@{ ViewData["Title"] = "Home Page"; } @model List<KeyValueViewModel>; <div class="text-center"> <h1 class="display-4">Welcome</h1> <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p> <h1>--------------------- This is line-------------------------</h1> <h2> This is a Azure KeyVault Secret value is: </h2> @foreach(var item in Model) { <p>Key:@item.Key;Value:@item.Value</p> } </div>
執行專案,檢視 Azure Key Vault 的 Secrets
OK!! 成功。?✌️?✌️?✌️
三,結尾
今天主要建立.NET Core Web 應用程式並且引用 ”Microsoft.Azure.KeyVault“,我們將使用 Azure Key Vault 集中儲存和管理 .NET Core Web 應用程式的機密資訊。它允許我們在多個應用程式之間共享的設定,包括在應用程式服務中使用。當您將應用程式配置為連線到 Key Vault 時,它會被新增為單獨的配置源。然後,我們可以像讀取任何其他配置資料一樣讀取 Azure Key Vault 的值。本文所分享的內容也存在著很多我自己的一些理解,有理解不到位的,還希望多多包涵,並且指出不足之處。
參考資料:關於 Azure Key Vault
github:https://github.com/yunqian44/Azure.KeyVault
作者:Allen
版權:轉載請在文章明顯位置註明作者及出處。如發現錯誤,歡迎批評指正。