前言

在开发中经常会用到一些敏感数据,比如AppSecret或数据库连接字符串,无论是硬编码还是写在配置文件中,最终都要push到svn或git上。对于开源项目,这些敏感数据就无隐私可言了,对于私有项目,一旦源代码管理服务器被黑,这些敏感数据也将暴露无遗。所以,最佳实践就是不要将敏感数据写到源代码中。

以往我们常常将数据库连接字符串写在web.config中,.NET Core中写在appsettings.json中,开发环境下如果一个开发者修改了连接字符串,为了不影响其他开发者,每次提交代码的时候就应该忽略该配置文件,如果还添加了其他配置,必须提交的话,要么先撤销连接字符串的修改再提交,要么直接提交会影响其他开发人员。很多时候,我们就是直接提交了,大不了其他开发者pull下来代码再修改一下。但是,最佳实践就是不要写在配置文件中。

注意,上面提到的问题都是在开发环境下。

Secret Manager

.NET Core中为我们提供了叫Secret Manager的工具,可以实现上文中的最佳实践,再次强调一次,Secret Manager只适用于开发环境中。

下面说一下Secret Manager,它帮我们抽象了一些细节,比如数据存储在哪以及如何存储的问题。简单来说它帮助我们将数据以明文的形式存在了本地的一个json文件中。系统不同存储的位置也不一样。

Windows

%APPDATA%\microsoft\UserSecrets\<userSecretsId>\secrets.json

Linux

~/.microsoft/usersecrets/<userSecretsId>/secrets.json

Mac

~/.microsoft/usersecrets/<userSecretsId>/secrets.json

userSecretsId是在.csproj文件中指定的,会在下文讲到。

安装、使用

配置User Secrets及访问需要用到两个包,分别为

Microsoft.Extensions.SecretManager.Tools
Microsoft.Extensions.Configuration.UserSecrets

简单说一下两者的作用,第一个是工具包,可以使用dotnet user-secrets命令将数据存储到json文件中,第二个包可以通过.NET Core的配置系统访问存储在json文件中的数据。

dotnet user-secrets -h

这个命令可以查看Secret Manager的用法。

它有4个命令

命令 描述 语法
clear 删除程序中所有的secrets dotnet user-secrets clear
list 列举程序中所有的secrets dotnet user-secrets list
remove 删除指定的secret dotnet user-secrets remove NameOfSecret
set 设置secret dotnet user-secrets set NameOfSecret ValueOfSecret

以Mac上举例,上面的命令都是操作~/.microsoft/usersecrets/<userSecretsId>/secrets.json这个文件,userSecretsId指定了是哪个项目的secrets。

userSecretsId在.csproj文件中指定。

<PropertyGroup>
<UserSecretsId>userSecretsId的值</UserSecretsId>
</PropertyGroup>

在mac或linux上,userSecretsId的值可以通过uuidgen生成。

在Microsoft.Extensions.Configuration.UserSecrets包扩展了ConfigurationBuilder,包含一个AddUserSecrets的扩展方法。如果想通过Configuration访问User Secrets只需要在调用build.AddUserSecrets()即可。

if (env.IsDevelopment())
{
// 搜索包含类型Startup的程序集添加User Secrets的配置源,Startup也可以换成其他程序集中的其他类型
builder.AddUserSecrets<Startup>();
}

或干脆直接指定userSecretsId

if(env.IsDevelopment())
{
builder.AddUserSecrets("UserSecretsId");
}

然后就可以通过Configuration["NameOfSecret"]访问到User Secret了。

项目实践

下面通过一个控制台程序演示。

  1. mkdir user-secrets && cd user-secrets # 新建一个目录
  2. dotnet new console # 创建一个控制台应用
  3. dotnet restore # 还原包
  4. dotnet add package Microsoft.Extensions.Configuration.UserSecrets -v 1.1.2 # 安装包
  5. code . # 使用Visual Studio Code打开
  6. 在user-secrets.csproj中添加UserSecretsId
<PropertyGroup>
<UserSecretsId>3BF2D901-89B9-437D-8856-CCA63D4606F7</UserSecretsId>
</PropertyGroup>

以及SecretManager工具包

<ItemGroup>
<DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="1.0.1" />
</ItemGroup>
  1. dotnet user-secrets set AppKey 12345 # 添加名为AppKey的Secret
  2. 为了判断是在开发环境中,需要添加环境变量,因此需要再安装一个包

    dotnet add package Microsoft.Extensions.Configuration.EnvironmentVariables -v 1.1.2
  3. 打开Program.cs,加入以下代码
    class Program
{
public static IConfigurationRoot Configuration { get; set; }
static void Main(string[] args)
{
var builder = new ConfigurationBuilder()
.AddEnvironmentVariables(); var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
if (environment == "Development")
{
builder.AddUserSecrets<Program>();
}
Configuration = builder.Build(); Console.WriteLine(Configuration["AppKey"]);
}
}
  1. 运行

    ASPNETCORE_ENVIRONMENT=Development dotnet run



    export ASPNETCORE_ENVIRONMENT=Development

    dotnet run

ASP.NET Core类似,这里就不再演示了。

有关.NET Core中User Secrets存储敏感数据的内容,本文就讲这些,如果您觉得对你有所帮助,请“点赞”支持一下,或者关注公众号“chengxulvtu",谢谢!

.NET Core程序中使用User Secrets存储敏感数据的更多相关文章

  1. .NET Core程序中,如何获取和设置操作系统环境变量的值

    有时候我们在.NET Core程序中需要获取和设置操作系统环境变量的值.本文演示如何使用Environment.GetEnvironmentVariable和Environment.SetEnviro ...

  2. .net core程序中使用微软的依赖注入框架

    我之前在博文中介绍过Asp.net core下系统自带的依赖注入框架,这个依赖框架在Microsoft.Extensions.DependencyInjection中实现,本身并不是.net core ...

  3. 在.net core程序中使用EntityFrameok(非EF Core)

    最近用NoSQL较多写,用传统的EF到不多,但在一些.net core小程序中也小试牛刀过,不过当时用的是微软为.net core量身定制的Entity Framework Core,只是一些比较常规 ...

  4. 在.NET Core程序中设置全局异常处理

    以前我们想设置全局异常处理只需要这样的代码: AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.UnhandledExc ...

  5. 云原生ASP.NET Core程序的可监测性和可观察性

    分布式应用程序很复杂,给开发人员调试和修复生产问题带来了一系列挑战.尽管微服务架构可帮助维持一支规模较小,可以自主工作并专注于独立业务团队,但由于其分布式性质,它带来了新的挑战.例如,在业务交易过程中 ...

  6. 在 ASP.NET Core 项目中使用 AutoMapper 进行实体映射

    一.前言 在实际项目开发过程中,我们使用到的各种 ORM 组件都可以很便捷的将我们获取到的数据绑定到对应的 List<T> 集合中,因为我们最终想要在页面上展示的数据与数据库实体类之间可能 ...

  7. .net core程序强制以管理员权限启动

    当我们编写windows程序的时候,很多时候需要程序默认以管理员权限运行,以前在.net 程序中直接新建一个app.manifest,设置requestedExecutionLevel 节点即可 &l ...

  8. ASP.NET Core教程:ASP.NET Core 程序部署到Windows系统

    一.创建项目 本篇文章介绍如何将一个ASP.NET Core Web程序部署到Windows系统上.这里以ASP.NET Core WebApi为例进行讲解.首先创建一个ASP.NET Core We ...

  9. Centos8 下部署 ASP.net Core 程序

    1.安装需要的SDK包,如果程序包含3.1版本,需要安装3.1的SDK. sudo dnf install dotnet-sdk-5.0dotnet --versiondotnet --list-ru ...

随机推荐

  1. JS上了贼船

    本文纯属个人观点,没有引经据典,没有小心求证,just吐槽. 互联网的火热.移动web,带动了前端的飞速发展,js好像搭上了顺风车,身价水涨船高,如日中天. web前端是啥?html + css + ...

  2. PHP中的对象遍历技巧

    PHP中的对象遍历 对象的遍历,主要是指遍历对象中的,对外部可见属性.实际上就是用访问限制符public声明的属性,这点大家肯定很熟悉了.并且,在php中,遍历对象居然与遍历数组一样,都可以用使用fo ...

  3. jQuery图片上传前先在本地预览(不经过后端处理)

    前段时间遇到一个问题,前端想实现图片上传预览(不经过后端PHP或JAVA处理),用户点击file按钮上传文件,点击确定马上就能看到预览的效果,但在实现的时候无论怎样都取不到file上图片的真实路径,得 ...

  4. list和map集合

    List特点:元素有放入顺序,元素可重复Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的)Map特点: ...

  5. php jquery+ajax写批量删除

      为了美观,我还是引入了bootstrap的模态框,我引入的是自己的数据库 library中的一张表 名为:maninfo表 是一张个人信息表  表的加载我就不写了,比较简单,  大概写一下需要的按 ...

  6. 基于java:读写一个英文的txt文件,记录单词个数,并输出十个出现最多的单词及出现的个数;

    import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; class W ...

  7. 2.solr学习速成之安装

    1.下载解压solr-5.3.1.tgz [root@205 opt]# tar -zxf solr-5.3.1.tgz -C /opt/module/ 2.将solr-5.3.1/server/so ...

  8. 测试class

    各种断言方法: assertEqual(a,b) a == b assertNotEqual(a,b) a != b assertTrue(x) x == True assertFalse(x) x ...

  9. JS 浏览器cookie的设置,读取,删除

    JavaScript是运行在客户端的脚本,因此一般是不能够设置Session的,因为Session是运行在服务器端的. 而cookie是运行在客户端的,所以可以用JS来设置cookie. 假设有这样一 ...

  10. Adobe After Effect CC2017 for Mac

    前段时间学习使用 Lottie 制作炫酷的动画,需要 Adobe After Effect 安装 bodymovin 插件,然后导出动画的 json 文件.尝试安装 AE 工具.网上查找 史蒂芬周的博 ...