Azure KeyVault(三)通過 Microsoft.Azure.KeyVault 類庫在 .NET Core 上獲取 Secrets

Grant_Allen發表於2022-02-22

一,引言

  上一篇文章,我們介紹了 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 

版權:轉載請在文章明顯位置註明作者及出處。如發現錯誤,歡迎批評指正。

相關文章