• Azure KeyVault(三)通过 Microsoft.Azure.KeyVault 类库在 .NET Core 上获取 Secrets


    一,引言

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

    4,Azure KeyVault(四)另类在 .NET Core 上操作 Secrets 的 类库方法-----Azure.Security.KeyVault.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 

    版权:转载请在文章明显位置注明作者及出处。如发现错误,欢迎批评指正。

  • 相关阅读:
    git clone 很慢提速方法
    在Windows上安装pytorch
    关于一些知名深度学习模型的转换
    【转】安装caffe2的参考
    Nasty Hacks
    寻梦
    Fibonacci Again
    统计元音
    首字母变大写
    查找最大元素
  • 原文地址:https://www.cnblogs.com/AllenMaster/p/15922491.html
Copyright © 2020-2023  润新知