.NET Core程序中使用User Secrets存储敏感数据

简介:

前言

在开发中经常会用到一些敏感数据比如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/\/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>
  7. dotnet user-secrets set AppKey 12345 # 添加名为AppKey的Secret

  8. 为了判断是在开发环境中需要添加环境变量因此需要再安装一个包
    dotnet add package Microsoft.Extensions.Configuration.EnvironmentVariables -v 1.1.2

  9. 打开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"]);
        }
    }
  10. 运行
    ASPNETCORE_ENVIRONMENT=Development dotnet run

    export ASPNETCORE_ENVIRONMENT=Development
    dotnet run

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














本文转自xmgdc51CTO博客,原文链接:http://blog.51cto.com/12953214/1942913 ,如需转载请自行联系原作者



相关文章
|
4月前
|
Java Spring
解决问题:‘HttpHeaders()‘ 在 ‘com.google.common.net.HttpHeaders‘ 中具有 private 访问权限
解决问题:‘HttpHeaders()‘ 在 ‘com.google.common.net.HttpHeaders‘ 中具有 private 访问权限
30 0
|
7月前
|
对象存储 数据安全/隐私保护 开发者
.net core 阿里云接口之获取临时访问凭证
假设您是一个移动App开发者,希望使用阿里云OSS服务来保存App的终端用户数据,并且要保证每个App用户之间的数据隔离。此时,您可以使用STS授权用户直接访问OSS。 使用STS授权用户直接访问OSS的流程如下: ![image.png](https://ucc.alicdn.com/pic/developer-ecology/j2ygdazy447va_7d767aa1db4047778a7b5c568b5d7c11.png) ## 1、关于秘钥等信息的申请见如下链接 [使用STS临时访问凭证访问OSS](https://help.aliyun.com/zh/oss/developer
99 0
|
7月前
|
对象存储
.net core 阿里云接口之拷贝文件
紧接上文, 1)[.net core 阿里云接口之获取临时访问凭证](https://developer.aliyun.com/article/1363447?spm=a2c6h.12873639.article-detail.7.2b0e5b1cpeWbZ5 ".net core 阿里云接口之获取临时访问凭证") 2)[.net core 阿里云接口之将指定的OSS文件下载到流](https://developer.aliyun.com/article/1363886 ".net core 阿里云接口之将指定的OSS文件下载到流") 本文继续阿里云接口调用,将指定的OSS文件下载到流。
37 0
|
8月前
|
开发框架 JSON Kubernetes
.NET Core - 环境变量配置和文件提供程序配置方式详解
.NET Core - 环境变量配置和文件提供程序配置方式详解
|
8月前
|
存储
.NET Core - 内存配置和命令行配置方式详解
.NET Core - 内存配置和命令行配置方式详解
|
JSON API 数据格式
八、.net core(.NET 6)配置读取appsettings文件内容的通用功能
添加通用读取配置文件功能在Wsk.Core.Package项目下,新增Microsoft.Extensions.Configuration包:
561 0
八、.net core(.NET 6)配置读取appsettings文件内容的通用功能
|
缓存 Linux Windows
.NET Core 获取主机运行资源的库
CZGL.SystemInfo 是一个支持 Windows 和 Linux 的资源信息获取库,用于获取系统环境、机器资源信息、系统资源使用情况。 Nuget 搜索 CZGL.SystemInfo 即可安装。 类库中每一个属性和方法,我都加上了注释,调用时可以看得到。
209 0
|
存储 JSON 前端开发
.net core实践系列之SSO-同域实现(一)
.net core实践系列之SSO-同域实现(一)
389 0
.net core实践系列之SSO-同域实现(一)
|
安全 数据安全/隐私保护
.net core实践系列之SSO-同域实现(二)
.net core实践系列之SSO-同域实现(二)
275 0
.net core实践系列之SSO-同域实现(二)
|
JSON API 数据格式
.NET Core2.1获取自定义配置文件信息
前言   .net core来势已不可阻挡。既然挡不了,那我们就顺应它。了解它并学习它。今天我们就来看看和之前.net版本的配置文件读取方式有何异同,这里不在赘述.NET Core 基础知识。 ps:更新版,更新了多种方式实现读取配置文件信息,各位看官结合自己实际情况选择合适的读取方式即可。
1603 0