asp.net core 6.0框架揭秘(使用ASP.NETCore)
asp.net core 6.0框架揭秘(使用ASP.NETCore)机密管理器工具不会加密存储的机密,也不应将其视为受信任的存储区。 它仅用于开发目的。 密钥和值存储在用户配置文件目录中的 JSON 配置文件中。警告环境变量通常以未加密的纯文本格式存储。 如果计算机或进程受到危害,则不受信任方可以访问环境变量。 可能需要其他措施来防止泄露用户机密。所有平台上的环境变量分层键都不支持 : 分隔符。 __(双下划线):机密管理器工具在开发 ASP.NET Core 项目的过程中存储敏感数据。 在此上下文中,一段敏感数据是应用程序机密。 应用密钥存储在与项目树不同的位置。 应用程序机密与特定项目关联或在多个项目之间共享。 应用密码未签入源控件。
如何管理开发计算机上的 ASP.NET Core 应用程序的敏感数据。 切勿在源代码中存储密码或其他敏感数据。 生产机密不应用于开发或测试。 机密不应与应用一起部署。 相反,应通过受控的方式(如环境变量或 Azure Key Vault)访问生产机密。 可使用 Azure Key Vault 配置提供程序存储和保护 Azure 测试和生产机密。
环境变量环境变量用于避免在代码中或在本地配置文件中存储应用程序机密。 环境变量会重写所有以前指定的配置源的配置值。
请考虑一个 ASP.NET Core web 应用,其中启用了 单个用户帐户 安全。 带有密钥的项目文件中包含默认的数据库连接字符串 appsettings.JSON DefaultConnection 。 默认连接字符串用于 LocalDB,它在用户模式下运行,不需要密码。 在应用程序部署过程中, DefaultConnection 可使用环境变量的值覆盖密钥值。 环境变量可以存储具有敏感凭据的完整连接字符串。
警告
环境变量通常以未加密的纯文本格式存储。 如果计算机或进程受到危害,则不受信任方可以访问环境变量。 可能需要其他措施来防止泄露用户机密。
所有平台上的环境变量分层键都不支持 : 分隔符。 __(双下划线):
- 受所有平台支持。 例如,Bash 不支持 : 分隔符,但支持 __。
- 自动替换为 :
机密管理器工具在开发 ASP.NET Core 项目的过程中存储敏感数据。 在此上下文中,一段敏感数据是应用程序机密。 应用密钥存储在与项目树不同的位置。 应用程序机密与特定项目关联或在多个项目之间共享。 应用密码未签入源控件。
警告
机密管理器工具不会加密存储的机密,也不应将其视为受信任的存储区。 它仅用于开发目的。 密钥和值存储在用户配置文件目录中的 JSON 配置文件中。
机密管理器工具的工作原理机密管理器工具隐藏了实现的详细信息,例如存储值的位置和方式。 您可以使用该工具,而无需了解这些实现细节。 这些值存储在本地计算机的用户配置文件文件夹中的 JSON 文件中:
- Windows
文件系统路径:
%APPDATA%\Microsoft\UserSecrets\<user_secrets_id>\secrets.json
- Linux/macOS
文件系统路径:
~/.microsoft/usersecrets/<user_secrets_id>/secrets.json
在前面的文件路径中,将替换 <user_secrets_id> 为 UserSecretsId 项目文件中指定的值。
不要编写依赖于通过机密管理器工具保存的数据的位置或格式的代码。 这些实现细节可能会发生变化。 例如,机密值不会加密,但可能会在将来。
启用密钥存储机密管理器工具对存储在用户配置文件中的特定于项目的配置设置进行操作。
机密管理器工具包含 init 命令。 若要使用用户机密,请在项目目录中运行以下命令:
.NET CLI
dotnet user-secrets init
前面的命令将在 UserSecretsId 项目文件的中添加一个元素 PropertyGroup 。 默认情况下,的内部文本 UserSecretsId 是 GUID。 内部文本是任意的,但对项目是唯一的。
XML
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
<UserSecretsId>79a3edd0-2092-40a2-a04d-dcb46d5ca9ed</UserSecretsId>
</PropertyGroup>
在 Visual Studio 中,右键单击 "解决方案资源管理器中的项目,然后从上下文菜单中选择"管理用户机密"。 此笔势将 UserSecretsId 使用 GUID 填充的元素添加到项目文件。
设置机密定义包含密钥及其值的应用密码。 机密与项目的值相关联 UserSecretsId 。 例如,从项目文件所在的目录运行以下命令:
.NET CLI
dotnet user-secrets set "Movies:ServiceApiKey" "12345"
在前面的示例中,冒号表示 Movies 是具有属性的对象文本 ServiceApiKey 。
机密管理器工具也可用于其他目录。 使用 --project 选项可提供项目文件所在的文件系统路径。 例如:
.NET CLI
dotnet user-secrets set "Movies:ServiceApiKey" "12345" --project "C:\apps\WebApp1\src\WebApp1"
Visual Studio 中的 JSON 结构平展
Visual Studio 的 "管理用户机密" 手势会在文本编辑器中打开一个 机密的 json 文件。 将 私钥的内容 替换为要存储的键/值对。 例如:
JSON
{
"Movies": {
"ConnectionString": "Server=(localdb)\\msSqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true"
"ServiceApiKey": "12345"
}
}
JSON 结构是通过或进行修改后平展的 dotnet user-secrets remove dotnet user-secrets set 。
例如,运行会 dotnet user-secrets remove "Movies:ConnectionString" 折叠 Movies 对象文本。 修改后的文件类似于以下 JSON:
JSON
{
"Movies:ServiceApiKey": "12345"
}
设置多个机密
可以通过管道 JSON 将密码批设置为 set 命令。 在下面的示例中,将 输入 json 文件的内容传递给 set 命令。
- Windows
- Linux/macOS
打开命令 shell,然后执行以下命令:
.NET CLI
type .\input.json | dotnet user-secrets set
访问机密
若要访问密钥,请完成以下步骤:
- 注册用户机密配置源
- 通过配置 API 读取机密
用户机密 配置提供程序 向 .NET 配置 API注册适当的配置源。
通过 dotnet new 或 Visual Studio 创建的 ASP.NET Core Web 应用会生成以下代码:
C#
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/" () => "Hello World!");
app.Run();
WebApplication.CreateBuilder 使用预配置的默认值初始化 WebApplicationBuilder 类的新实例。 WebApplicationBuilder当为时,初始化的 (builder) 提供默认配置和调用 AddUserSecrets EnvironmentName Development :
通过配置 API 读取机密请考虑以下读取密钥的示例 Movies:ServiceApiKey :
Program .cs 文件:
C#
var builder = WebApplication.CreateBuilder(args);
var movieApiKey = builder.Configuration["Movies:ServiceApiKey"];
var app = builder.Build();
app.MapGet("/" () => movieApiKey);
app.Run();
Razor 页面页面模型:
C#
public class IndexModel : PageModel
{
private readonly IConfiguration _config;
public IndexModel(IConfiguration config)
{
_config = config;
}
public void OnGet()
{
var moviesApiKey = _config["Movies:ServiceApiKey"];
// call Movies service with the API key
}
}
有关详细信息,请参阅 ASP.NET Core 中的配置。
将机密映射到 POCO将整个对象文本映射到 POCO (具有属性) 的简单 .NET 类对于聚合相关属性十分有用。
假设文件上的应用 secrets.js 包含以下两个机密:
JSON
{
"Movies": {
"ServiceApiKey": "12345"
"ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
若要将上述机密映射到 POCO,请使用 .NET 配置 API 的 对象图绑定 功能。 下面的代码绑定到自定义 MovieSettings POCO 并访问 ServiceApiKey 属性值:
C#
var moviesConfig =
Configuration.GetSection("Movies").Get<MovieSettings>();
_moviesApiKey = moviesConfig.ServiceApiKey;
Movies:ConnectionString和 Movies:ServiceApiKey 机密映射到中的相应属性 MovieSettings :
C#
public class MovieSettings
{
public string ConnectionString { get; set; }
public string ServiceApiKey { get; set; }
}
用机密替换字符串
以纯文本形式存储密码是不安全的。 例如,存储在中的数据库连接字符串 appsettings.json 可能包含指定用户的密码:
JSON
{
"ConnectionStrings": {
"Movies": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;User Id=johndoe;Password=pass123;MultipleActiveResultSets=true"
}
}
更安全的方法是将密码存储为机密。 例如:
.NET CLI
dotnet user-secrets set "DbPassword" "pass123"
Password从中的连接字符串中移除键值对 appsettings.json 。 例如:
JSON
{
"ConnectionStrings": {
"Movies": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;User Id=johndoe;MultipleActiveResultSets=true"
}
}
可以对对象的属性设置机密的值 SqlConnectionStringBuilder Password ,以完成连接字符串:
C#
using System.Data.SqlClient;
var builder = WebApplication.CreateBuilder(args);
var conStrBuilder = new SqlConnectionStringBuilder(
builder.Configuration.GetConnectionString("Movies"));
conStrBuilder.Password = builder.Configuration["DbPassword"];
var connection = conStrBuilder.ConnectionString;
var app = builder.Build();
app.MapGet("/" () => connection);
app.Run();
列出机密
假设文件上的应用 secrets.js 包含以下两个机密:
JSON
{
"Movies": {
"ServiceApiKey": "12345"
"ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
从项目文件所在的目录运行以下命令:
.NET CLI
dotnet user-secrets list
随即显示以下输出:
控制台
Movies:ConnectionString = Server=(localdb)\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true
Movies:ServiceApiKey = 12345
在前面的示例中,键名称中的冒号表示 机密 json 中的对象层次结构。
删除单个机密假设文件上的应用 secrets.js 包含以下两个机密:
JSON
{
"Movies": {
"ServiceApiKey": "12345"
"ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
从项目文件所在的目录运行以下命令:
.NET CLI
dotnet user-secrets remove "Movies:ConnectionString"
已修改应用的 机密 json 文件,以删除与密钥关联的键值对 MoviesConnectionString :
JSON
{
"Movies": {
"ServiceApiKey": "12345"
}
}
dotnet user-secrets list 显示以下消息:
控制台
Movies:ServiceApiKey = 12345
删除所有机密
假设文件上的应用 secrets.js 包含以下两个机密:
JSON
{
"Movies": {
"ServiceApiKey": "12345"
"ConnectionString": "Server=(localdb)\\mssqllocaldb;Database=Movie-1;Trusted_Connection=True;MultipleActiveResultSets=true"
}
}
从项目文件所在的目录运行以下命令:
.NET CLI
dotnet user-secrets clear
此应用的所有用户密码已从 以下文件中 删除:
JSON
{}
运行 dotnet user-secrets list 将显示以下消息:
控制台
No secrets configured for this application.
利用 Visual Studio 管理用户机密
若要在 Visual Studio 中管理用户机密,请在解决方案资源管理器中右键单击项目,然后选择 "管理用户机密":