Azure KeyVault(四)另類在 .NET Core 上操作 Secrets 的類庫方法-----Azure.Security.KeyVault.Secrets

Grant_Allen發表於2022-03-08

一,引言

  上一篇文章我們在 .Net Core Web 專案中新增了 “Microsoft.Azure.KeyVault” 的 Nuget 包操作 Azure KeyVault 的 Secrets 資料。微軟已經將 “Microsoft.Azure.KeyVault” Nuget 遺棄了,推薦大家使用 “Azure.Security.KeyVault.Secrets”。

  1)Azure Key Vault 機密客戶端庫允許我們安全地儲存和控制對令牌、密碼、API 金鑰和其他機密的訪問。該庫提供建立、檢索、更新、刪除、清除、備份、恢復和列出機密及其版本的操作。

  2)SecretClient 在 SDK 中提供同步和非同步操作,允許根據應用程式的用例選擇客戶端。初始化 SecretClient 後,就可以與 Azure Key Vault 中的機密進行互動。

基於以上兩點,今天繼續分享 Azure Key Vault 的相關知識,使用新的 "Azure.Security.KeyVault.Secrets" 操作 Azure Key Vault 的 Secrets。

-------------------- 我是分割線 --------------------

1,Azure Kay Vault(一).NET Core Console App 獲取金鑰保管庫中的機密資訊

2,Azure Key Vault(二)- 入門簡介

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

4,Azure KeyVault(四)另類在 .NET Core 上操作 Secrets 的 類庫方法-----Azure.Security.KeyVault.Secrets

二,正文

1,新增 “Azure.Security.KeyVault.Secrets” 的 Nuget 程式包

使用程式包管理控制檯進行安裝

Install-Package Azure.Security.KeyVault.Secrets -Version 4.2.0

2,建立 ISecretsService 介面和 SecretsService 實現類,以及控制器方法

ISecretsService.cs

public interface ISecretsService
    {
        Task<string> GetSecretsAsync(string key);

        Task<string> SetSecretAsync(string key,string value);

        Task<string> DeleteSecretAsync(string key);
    }

SecrectsService.cs

    public class SecretsService : ISecretsService
    {
        private readonly SecretClient _secretClient;

        public SecretsService(SecretClient secretClient)
        {
            this._secretClient = secretClient;
        }

        public async Task<string> GetSecretsAsync(string key)
        {
            var secret= await _secretClient.GetSecretAsync(key);
            return secret.Value.Value;
        }

        public async Task<string> SetSecretAsync(string key, string value)
        {
            var setSecret= await _secretClient.SetSecretAsync(key, value);
            return setSecret.Value.Value;
        }


        public async Task<string> DeleteSecretAsync(string key)
        {
            var operation= await _secretClient.StartDeleteSecretAsync(key);
            var deleteSecret= await operation.WaitForCompletionAsync();
            await _secretClient.PurgeDeletedSecretAsync(operation.Value.Name);

            return deleteSecret.Value.Value;
        }
    }

HomeController.cs

public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;

        private readonly IKeyVaultService _keyVaultService;

        private readonly ISecretsService _secretsService;

        public HomeController(ILogger<HomeController> logger,
            IKeyVaultService keyVaultService,
            ISecretsService secretsService)
        {
            _logger = logger;
            _keyVaultService = keyVaultService;
            _secretsService = secretsService;
        }

        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();
        }


        public async Task<IActionResult> Secrets()
        {
            var list = new List<KeyValueViewModel>();
            list.Add(new KeyValueViewModel() { Key = "cnbate-name", Value = await _secretsService.GetSecretsAsync("cnbate-name") });
            list.Add(new KeyValueViewModel() { Key = "cnbate-num", Value = await _secretsService.GetSecretsAsync("cnbate-num") });
            list.Add(new KeyValueViewModel() { Key = "cnbate-time", Value = await _secretsService.GetSecretsAsync("cnbate-time") });

            return View(list);
        }

        [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
        public IActionResult Error()
        {
            return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
        }
    }

3,新增對 SecretsService 和 SecretClient 的注入

services.AddSingleton(new Appsettings(Env.ContentRootPath));
services.AddSingleton(x => new SecretClient(vaultUri: new Uri(Appsettings.app("AzureKeyVault", "Endpoint")), credential: new DefaultAzureCredential()));
services.AddScoped<ISecretsService, SecretsService>();

4,測試使用新的獲取 Secrets 的 Nuget 包中的方法是否能正常操作 Azure KeyVault 的 Secrets 資料

F5 執行專案,獲取儲存的所有的 Secrets 資料

Bingo !!!! 成功。新增,刪除 Secrets 的操作,我就不再演示了,大家可以自行下載程式碼進行操作。

三,結尾

本文所分享的內容也存在著很多我自己的一些理解,有理解不到位的,還希望多多包涵,並且指出不足之處。

參考資料:關於 Azure Key Vault

github:https://github.com/yunqian44/Azure.KeyVault

作者:Allen 

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

相關文章