ASP.NET Core 优雅的在开发环境保存机密(User Secrets)

前言

在应用程序开发的过程中,有的时候需要在代码中保存一些机密的信息,比如加密密钥,字符串,或者是用户名密码等。通常的做法是保存到一个配置文件中,在以前我们会把他保存到web.config中,但是在ASP.NET Core中,这一方式或许发生了改变,或者说你有更多多元化的方法, 以及更加优雅的的配置来设置或者保存这些机密资料。

起初我以为这个UserSecrets它并没有什么用,因为我有需要配置的地方我直接配置到appsetting.json文件中就可以了,直到一次开发过程中,我才感受到了它真正的用途。

目录

用户机密介绍

如何添加用户机密

在应用程序中使用用户机密

总结

用户机密介绍

有以下场景大家可以想一下在以前的代码中我们是怎么样处理的:

需要保存一些和第三方网站对接的密钥,比如和 微信,微博站点使用的 appkey

给每个开发人员配置不用的用户名密码来访问一些资源

开发人员在开发过程中使用各自本机的数据库,如何配置数据库地址、账号和密码

假设说最后一项,每个开发要使用自己本机的数据库,你可能会说让每个人修改自己的web.config,在提交代码的时候不提交就行了。那么如果在web.config添加其他配置项的时候,显然不提交web.config文件不合理的。

现在,ASP.NET Core 提供了一种很优雅简洁的方式 User Secrets 用来帮助我们解决这个事情。

在新建一个 ASP.NET Core Web 应用程序的时候,会在 Startup.cs 文件中看到这样一段代码:

public Startup(IHostingEnvironment env) {
..... if (env.IsDevelopment())
{
builder.AddUserSecrets();
}

builder.AddEnvironmentVariables();
}
在 project.json 文件中,会看到 User Secrets 相关的一些配置

{
"userSecretsId": "aspnet-WebAppCore-e278c40f-15bd-4c19-9662-541514f02f3e"
...
"Microsoft.Extensions.Configuration.UserSecrets": "1.0.0",
"Microsoft.Extensions.SecretManager.Tools": “1.0.0-preview2-final”
}
可以看到builder.AddUserSecrets这行代码,他是在开发环境才运行的。

userSecretsId是用来标识项目的User Secrets唯一性的,如果有两个项目需要使用不同的Secrets ,这就需要有不同的userSecretsId。

Microsoft.Extensions.SecretManager.Tools 主要是用来设置或者查看secrets的值。

如何添加用户机密

可以在命令行中使用命令来添加:

切换命令行窗口到程序的运行目录, 输入 dotnet user-secrets -h ,来查看可以使用的命令

使用 dotnet user-secrets list 列出所有的用户机密

使用 dotnet user-secrets set WeChatAppKey "X3423FEED2435DD"设置一个用户机密,其中 WebChatAppKey 为键,后面的是值。

然后使用dotnet user-secrets list来查看设置的键值对。

然后我又设置了一个数据库的连接字符串进去。

以上是使用命令行的方式来设置用户机密,也可以使用 Visual Studio 2015代替命令行来做这项工作。

Visual Studio中,在Web项目上右键,可以看到一个 管理用户机密 的菜单:

点击打开时候,会出现一个secrets.json的文件,里面就是刚刚在命令行设置的键值对:

有些同学可能会问既然是存储到secrets.json,那么这个文件是在哪里呢?

secrets.json的存储位置?

在非Windows系统中,它的存储位置在

~http://www . qixoo.com/.microsoft/usersecrets/<userSecretsId>/secrets.json
在Windows系统中,它的位置在

C:\Users\用户名\AppData\Roaming\Microsoft\UserSecrets\aspnet-WebAppCore-e278c40f-15bd-4c19-9662-541514f02f3e
可以看到,存储的上层文件夹就是project.json文件中的 userSecretsId 设定的值。

在应用程序中使用用户机密

要在应用程序中访问配置的用户机密,你需要保证project.json文件中存在依赖项:
Microsoft.Extensions.Configuration.UserSecrets 并且builder.AddUserSecrets()。

然后在Startup.cs文件中通过 Configuration 对象访问

public IConfigurationRoot Configuration { get; }

public void ConfigureServices(IServiceCollection services){
var wechatKey = Configuration["WeChatAppKey"]
}
你可以使用DI来将用户机密映射到一个C#类文件,像这样

secrets.json

{ "SecretsKeys":
{
WeCharAppKey:"xxejfwert3045",
WeboAppKey:"35402345lkefgjlkdfg",
.....
}
}
SecretsKeysConfig.cs

public class SecretsKeysConfig{
public string WeCharAppKey { get; set;}
public string WeboAppKey { get; set;}
// ......}
Startup.cs

public void ConfigureServices(IServiceCollection services){
services.Configure<SecretsKeysConfig>(Configuration.GetSection("SecretsKeys"));
// 其他代码}
HomeController.cs

public class HomeController : Controller{
public SecretsKeysConfig AppConfigs { get; }
public HomeController(IOptions<SecretsKeysConfig> appkeys) {
AppConfigs = appkeys.Value;
}

}
注意:如果你的appsetting.json文件中有和secrets.json文件中相同节点(冲突)的配置项,那么就会被secrets.json中的设置项给覆盖掉,因为 builder.AddUserSecrets()晚于 AddJsonFile("appsettings.json")注册, 那么我们可以利用这个特性来在每个开发人员的机器上重新设置数据库连接字符串了。
总结

以上,或许可以感受到微软在 ASP.NET Core 中对于开发人员还是非常贴心的,很多小细节都考虑到了,因此在我们构建应用程序的过程中,可以多使用这些小功能(特性)来让我们的代码更加的优雅~

时间: 2024-08-24 07:39:35

ASP.NET Core 优雅的在开发环境保存机密(User Secrets)的相关文章

ASP.NET Core 发布至Linux生产环境 Ubuntu 系统

ASP.NET Core 发布至Linux生产环境 Ubuntu 系统,之前跟大家讲解了 dotnet publish 发布,而没有将整个系统串起来. 今天就跟大家综合的讲一下ASP.NET Core发布至Linux生产环境. 开发及发布环境:WIN10 x64  生产Linux环境:Ubuntu 14.04 发布的示例代码: https://github.com/linezero/NETCoreBBS 代码下载下来,首先请注释 Program.cs 中 .UseUrls("http://*:8

在ASP.NET Core中使用Apworks开发数据服务:对HAL的支持

HAL,全称为Hypertext Application Language,它是一种简单的数据格式,它能以一种简单.统一的形式,在API中引入超链接特性,使得API的可发现性(discoverable)更强,并具有自描述的特点.使用了HAL的API会更容易地被第三方开源库所调用,并且使用起来也很方便,开发者可以像处理普通JSON数据那样去处理API数据.有关HAL的更多信息,可以参考官方网站:http://stateless.co/hal_specification.html.目前,很多REST

ASP.NET Core Web 应用程序开发期间部署到IIS自定义主机域名并附加到进程调试

原文:ASP.NET Core Web 应用程序开发期间部署到IIS自定义主机域名并附加到进程调试 想必大家之前在进行ASP.NET Web 应用程序开发期间都有用到过将我们的网站部署到IIS自定义主机域名并附加到进程进行调试. 那我们的ASP.NET Core Web 应用程序又是如何部署到我们的IIS上面进行调试的呢,接下来我们来简单介绍下: 一.安装IIS所需的Host扩展(Windows Server Hosting) 下载地址:https://dotnet.microsoft.com/

.Net Core+Angular Cli/Angular4开发环境搭建教程

一.基础环境配置1.安装VS2017v15.3或以上版本2.安装VSCode最新版本3.安装Node.jsv6.9以上版本4.重置全局npm源,修正为淘宝的NPM镜像:npminstall-gcnpm 一.基础环境配置 1.安装VS 2017 v15.3或以上版本2.安装VS Code最新版本3.安装Node.js v6.9以上版本4.重置全局npm源,修正为 淘宝的 NPM 镜像: npm install -g cnpm --registry=https://registry.npm.taob

适合 ASP.NET Core 的超级-DRY开发

作者 Thomas Hansen DRY 是那些非常重要的软件体系结构缩写之一.它的意思是“不要自我重复”,并向维护旧源代码项目的任何用户阐明了一个重要原则.也就是说,如果你在代码中自我重复,会发现每个 bug 修复和功能更新都会重复你的修改. 代码重复降低了项目的可维护性,并使应用更改变得更加困难.重复次数越多,最终得到的混乱不堪的代码就越多.另一方面,如果避免重复,最终将获得更易于维护和修复 bug 的项目,并且你将成为一名更快乐.更高效的软件开发人员.简而言之,编写 DRY 代码可以帮助创

Asp.Net Core 入门(九)—— 环境变量 TagHelper

我们在之前讲Program.cs文件做了什么的时候,提到启动CreaeDefaultBuilder会获取环境变量来做一些判断之类的操作.那么我们的Taghelper也可以使用“ASPNETCORE_ENVIRONMENT"变量来设置在什么环境下加载什么库文件.可以通过environment标签来使用. <environment include="Development"> <link href="~/lib/twitter-bootstrap/cs

零基础ASP.NET Core MVC插件式开发

//services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);            services.AddMvc().ConfigureApplicationPartManager(apm =>            {                // 和主项目里面注册插件项目类似,这里注册主程序dll,主要是为了在vs里面直接运行调试,不需要发布到主项目用主项目来运行             

【新书推荐】《ASP.NET Core微服务实战:在云环境中开发、测试和部署跨平台服务》 带你走近微服务开发

<ASP.NET Core 微服务实战>译者序:https://blog.jijiechen.com/post/aspnetcore-microservices-preface-by-translator/ "微服务"的概念在 2014 年正式提出之后,越来越多的团队开始用它来设计自己的业务系统,各种微服务框架和开发过程管理方法也同时兴起.不断成熟.微服务设计方法清晰地定义了各个开发团队的业务边界,微服务框架以不同的方式实现了服务之间的协作与集成,根据康威定律我们可以推导这

ASP.NET Core开发Docker部署

ASP.NET Core开发Docker部署,.NET Core支持Docker 部署运行.我们将ASP.NET Core 部署在Docker 上运行. 大家可能都见识过Docker ,今天我们就详细了解一下Docker的用途,以及真实的应用场景. Docker源于PaaS,PaaS的应用场景即是Docker的应用场景. Platform as a Service: 平台即服务, 是面向软件开发者的服务, 云计算平台提供硬件, OS, 编程语言, 开发库, 部署工具, 帮助软件开发者更快的开发软