.NET Core程序中使用User Secrets存储敏感数据
2021-07-09 03:03
标签:net 在开发中经常会用到一些敏感数据比如AppSecret或数据库连接字符串无论是硬编码还是写在配置文件中最终都要push到svn或git上。对于开源项目这些敏感数据就无隐私可言了对于私有项目一旦源代码管理服务器被黑这些敏感数据也将暴露无遗。所以最佳实践就是不要将敏感数据写到源代码中。 以往我们常常将数据库连接字符串写在web.config中.NET Core中写在appsettings.json中开发环境下如果一个开发者修改了连接字符串为了不影响其他开发者每次提交代码的时候就应该忽略该配置文件如果还添加了其他配置必须提交的话要么先撤销连接字符串的修改再提交要么直接提交会影响其他开发人员。很多时候我们就是直接提交了大不了其他开发者pull下来代码再修改一下。但是最佳实践就是不要写在配置文件中。 注意上面提到的问题都是在开发环境下。 .NET Core中为我们提供了叫Secret Manager的工具可以实现上文中的最佳实践再次强调一次Secret Manager只适用于开发环境中。 下面说一下Secret Manager它帮我们抽象了一些细节比如数据存储在哪以及如何存储的问题。简单来说它帮助我们将数据以明文的形式存在了本地的一个json文件中。系统不同存储的位置也不一样。 Windows Linux Mac userSecretsId是在.csproj文件中指定的会在下文讲到。 配置User Secrets及访问需要用到两个包分别为 简单说一下两者的作用第一个是工具包可以使用dotnet user-secrets命令将数据存储到json文件中第二个包可以通过.NET Core的配置系统访问存储在json文件中的数据。 这个命令可以查看Secret Manager的用法。 它有4个命令 以Mac上举例上面的命令都是操作~/.microsoft/usersecrets/\/secrets.json这个文件userSecretsId指定了是哪个项目的secrets。 userSecretsId在.csproj文件中指定。 在mac或linux上userSecretsId的值可以通过uuidgen生成。 在Microsoft.Extensions.Configuration.UserSecrets包扩展了ConfigurationBuilder包含一个AddUserSecrets的扩展方法。如果想通过Configuration访问User Secrets只需要在调用build.AddUserSecrets()即可。 或干脆直接指定userSecretsId 然后就可以通过Configuration["NameOfSecret"]访问到User Secret了。 下面通过一个控制台程序演示。 mkdir user-secrets && cd user-secrets # 新建一个目录 dotnet new console # 创建一个控制台应用 dotnet restore # 还原包 dotnet add package Microsoft.Extensions.Configuration.UserSecrets -v 1.1.2 # 安装包 code . # 使用Visual Studio Code打开 在user-secrets.csproj中添加UserSecretsId 以及SecretManager工具包 dotnet user-secrets set AppKey 12345 # 添加名为AppKey的Secret 为了判断是在开发环境中需要添加环境变量因此需要再安装一个包 打开Program.cs加入以下代码 运行 ASP.NET Core类似这里就不再演示了。 .NET Core程序中使用User Secrets存储敏感数据 标签:net 原文地址:http://12953214.blog.51cto.com/12943214/1942913前言
Secret Manager
%APPDATA%\microsoft\UserSecrets\
~/.microsoft/usersecrets/
~/.microsoft/usersecrets/
安装、使用
Microsoft.Extensions.SecretManager.Tools
Microsoft.Extensions.Configuration.UserSecrets
dotnet user-secrets -h
命令
描述
语法
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
if (env.IsDevelopment())
{
// 搜索包含类型Startup的程序集添加User Secrets的配置源Startup也可以换成其他程序集中的其他类型
builder.AddUserSecrets
if(env.IsDevelopment())
{
builder.AddUserSecrets("UserSecretsId");
}
项目实践
dotnet add package Microsoft.Extensions.Configuration.EnvironmentVariables -v 1.1.2class 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
ASPNETCORE_ENVIRONMENT=Development dotnet run
或
export ASPNETCORE_ENVIRONMENT=Development
dotnet run
上一篇:JavaScript 闭包
下一篇:phpstorm 快捷方式
文章标题:.NET Core程序中使用User Secrets存储敏感数据
文章链接:http://soscw.com/essay/102583.html