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
二,正文
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
版权:转载请在文章明显位置注明作者及出处。如发现错误,欢迎批评指正。
Azure KeyVault(三)通过 Microsoft.Azure.KeyVault 类库在 .NET Core 上获取 Secrets的更多相关文章
- Azure KeyVault(四)另类在 .NET Core 上操作 Secrets 的类库方法-----Azure.Security.KeyVault.Secrets
		
一,引言 上一篇文章我们在 .Net Core Web 项目中添加了 "Microsoft.Azure.KeyVault" 的 Nuget 包操作 Azure KeyVault 的 ...
 - Microsoft Azure News(2) 在Microsoft Azure上运行SAP应用程序
		
<Windows Azure Platform 系列文章目录> 2014年6月27日消息,在 Microsoft Azure 上提供 SAP Business Suite 软件.All-I ...
 - Microsoft Azure Web Sites应用与实践【1】—— 打造你的第一个Microsoft Azure Website
		
Microsoft Azure Web Sites应用与实践 系列: [1]—— 打造你的第一个Microsoft Azure Website [2]—— 通过本地IIS 远程管理Microsoft ...
 - 设置将 Microsoft Azure 的网络基础结构以支持设置为灾难恢复站点
		
Prateek Sharma 云 + Enterprise 高级项目经理 Azure SiteRecovery (ASR)可以将Microsoft Azure用作您的虚拟机的灾难恢复站点. 当管理 ...
 - Microsoft Azure Web Sites应用与实践【4】—— Microsoft Azure网站的“后门”
		
Microsoft Azure Web Sites应用与实践 系列: [1]—— 打造你的第一个Microsoft Azure Website [2]—— 通过本地IIS 远程管理Microsoft ...
 - 使用VNET-to-VNET连接Microsoft Azure国际版和中国版
		
Microsoft Azure的VNET-to-VNET功能可以实现跨虚拟网络的VPN连接,通过VNET-to-VNET互联的两个虚拟网络可以在同一个订阅下或者隶属不同的订阅,而且可以跨数据中心.这实 ...
 - 保持与 Microsoft Azure Files 的连接
		
我们在最近的博客文章中介绍了 Azure StorageFiles的预览版,请单击此处.该文章包含 Azure Files 的相关信息,说明了如何申请预览版并开始使用,还介绍了一些有助于创建共享和传 ...
 - Microsoft Azure Tutorial: Build your first movie inventory web app with just a few lines of code
		
Editor’s Note: The following is a guest post from Mustafa Mahmutović, a Microsoft Student Partner wh ...
 - 利用KeyVault来加强存储Azure Storage访问密钥管理
		
很多时候管理Azure的存储账号我们都需要通过下面的界面管理访问密钥,大部分情况下通过密钥的轮替使用更新就可以做到安全管理了. 但是很多时候存储账号的Key就会不小心分发到开人员.测试人员.和管理员手 ...
 
随机推荐
- Linux基础之终端、控制台、tty、pty简介说明
			
最近在搞Linux提权的时候,有时候su 用户名 登录的时候发现登录不了,因为tty终端,交互不了,所以我也来总结一下 一. 基本概念 1. ttytty(终端设备的统称):tty一词源于telety ...
 - 面渣逆袭:Java并发六十问,快来看看你会多少道!
			
大家好,我是老三,面渣逆袭 继续,这节我们来盘一盘另一个面试必问知识点--Java并发. 这篇文章有点长,四万字,图文详解六十道Java并发面试题.人已经肝麻了,大家可以点赞.收藏慢慢看!扶我起来,我 ...
 - 记一次异步处理导致Jetty Request对象泄漏
			
最近排查一个bug,发现了一系列有意思的东西,对「自定义线程池」.「Jetty线程模型」都有了一些新的认识. 本文预计阅读时间10分钟,包括: 问题表现 常见原因筛查 根因与源码分析 最佳实践 一些小 ...
 - actf2020 exec
			
actf2020 exec 1.根据提示,ping一个127.0.0.1,有回显,ls一下发现index.php 3.方向找错了,绕了一大圈,还cat了index.php也没发现什么 最后没招了,回原 ...
 - 【记录一个问题】没用任何用处的解决了libtask的context.c在32位NDK下的编译问题
			
32位下用ndk编译libtask出现这样的错误: [armeabi-v7a] Compile thumb : task <= context.c /Users/ahfu/code/androi ...
 - 线程同步介绍及 生产者消费者问题举例 C#版
			
现在有五个工人在果园摘水果,一次只能摘一个,摘下的水果放入一个框中,这种框最多只能装50个橘子,一共有两个这样的框.当一个工人装框时,其他工人不能在使用这个框.当两个框都装满了,工人只有等框里有剩余位 ...
 - golang反射reflect机制用法
			
package main import ( "fmt" "reflect" ) type User struct { Id int Name string Ag ...
 - GitHub镜像
			
GitHub 官网镜像(可以用来clone push等,但是不能登录) https://github.com.cnpmjs.org https://git.sdut.me https://hub.fa ...
 - 事件驱动架构在 vivo 内容平台的实践
			
一.什么是事件驱动架构 当下,随着微服务的兴起,容器化技术的发展,以及云原生.serverless 概念的普及,事件驱动再次引起业界的广泛关注. 所谓事件驱动的架构,也就是使用事件来实现跨多个服务的业 ...
 - Gc如何判断对象可以被回收?
			
Gc如何判断对象可以被回收? 1 引用计数器 引用计数法的算法思路:给对象增加一个引用计数器,每当对象增加一个引用计数器+1,失去一个引用-1,所以当计数器是0的时候对象就没有引用了,就会被认为可回收 ...