文档
-
了解如何在 ASP.NET Core 中配置数据保护。
-
了解如何为你不能或不想使用依赖项注入提供的服务的数据保护方案提供支持。
-
浏览介绍如何在 ASP.NET Core 中配置数据保护的主题。
应用尝试检测其操作环境并自行处理密钥配置。
如果应用托管在 Azure 应用中,则密钥将保存到 %HOME%\ASP.NET\DataProtection-Keys 文件夹中。 此文件夹由网络存储提供支持,并跨托管应用的所有计算机同步。
如果用户配置文件可用,密钥将保存到 %LOCALAPPDATA%\ASP.NET\DataProtection-Keys 文件夹中。 如果操作系统是 Windows,则使用 DPAPI 对密钥进行静态加密。
同时还必须启用应用池的 setProfileEnvironment attribute。 setProfileEnvironment
的默认值为 true
。 在某些情况下(例如,Windows 操作系统),将 setProfileEnvironment
设置为 false
。 如果密钥未按预期存储在用户配置文件目录中,请执行以下操作:
<system.applicationHost><applicationPools><applicationPoolDefaults><processModel>
元素。setProfileEnvironment
属性不存在,这会将值默认设置为 true
,或者将属性的值显式设置为 true
。如果应用托管在 IIS 中,密钥将保存到 HKLM 注册表的特殊注册表项中,该注册表项仅列在工作进程帐户的 ACL 中。 使用 DPAPI 对密钥进行静态加密。
如果这些条件都不匹配,则密钥不会保存在当前进程之外。 当进程关闭时,生成的所有密钥都将丢失。
开发人员始终拥有完全控制权,并且可以替代密钥的存储方式和存储位置。 上面的前三个选项应该为大多数应用提供良好的默认值,类似于 ASP.NET <machineKey> 自动生成例程过去的工作方式。 最后的回退选项是唯一需要开发人员在想要保存密钥时预先指定配置的方案,但此回退仅在极少数情况下发生。
在 Docker 容器中托管时,密钥应保存在作为 Docker 卷(在容器生存期过后仍然存在的共享卷或主机装载的卷)的文件夹中或外部提供程序中,例如 Azure Key Vault 或 Redis。 外部提供程序在应用无法访问共享网络卷的 Web 场方案中也很有用(有关详细信息,请参阅 PersistKeysToFileSystem)。
警告
如果开发人员重写上述规则,并将数据保护系统指向特定密钥存储库,则会禁用静态密钥的自动加密。 可以通过配置重新启用静态保护。
默认情况下,密钥的生存期为 90 天。 当密钥过期时,应用会自动生成一个新密钥并将新密钥设置为活动密钥。 只要停用的密钥保留在系统上,应用就可以解密受这些密钥保护的任何数据。 有关详细信息,请参阅密钥管理。
使用的默认有效负载保护算法为 AES-256-CBC(保证机密性)和 HMACSHA256(保证真实性)。 系统使用每 90 天更改一次的 512 位主密钥,根据每个有效负载派生用于这些算法的两个子密钥。 有关详细信息,请参阅子密钥派生。
删除密钥会使其受保护的数据永久不可访问。 为了降低这种风险,建议不要删除密钥。 密钥的累积通常影响最小,因为它们很小。 在特殊情况下(例如运行时间极长的服务)可以删除密钥。 仅删除密钥:
建议不要删除数据保护密钥。
using Microsoft.AspNetCore.DataProtection.KeyManagement;
var services = new ServiceCollection();
services.AddDataProtection();
var serviceProvider = services.BuildServiceProvider();
var keyManager = serviceProvider.GetService<IKeyManager>();
if (keyManager is IDeletableKeyManager deletableKeyManager)
{
var utcNow = DateTimeOffset.UtcNow;
var yearAgo = utcNow.AddYears(-1);
if (!deletableKeyManager.DeleteKeys(key => key.ExpirationDate < yearAgo))
{
Console.WriteLine("Failed to delete keys.");
}
else
{
Console.WriteLine("Old keys deleted successfully.");
}
}
else
{
Console.WriteLine("Key manager does not support deletion.");
}
应用尝试检测其操作环境并自行处理密钥配置。
如果应用托管在 Azure 应用中,则密钥将保存到 %HOME%\ASP.NET\DataProtection-Keys 文件夹中。 此文件夹由网络存储提供支持,并跨托管应用的所有计算机同步。
如果用户配置文件可用,密钥将保存到 %LOCALAPPDATA%\ASP.NET\DataProtection-Keys 文件夹中。 如果操作系统是 Windows,则使用 DPAPI 对密钥进行静态加密。
同时还必须启用应用池的 setProfileEnvironment attribute。 setProfileEnvironment
的默认值为 true
。 在某些情况下(例如,Windows 操作系统),将 setProfileEnvironment
设置为 false
。 如果密钥未按预期存储在用户配置文件目录中,请执行以下操作:
<system.applicationHost><applicationPools><applicationPoolDefaults><processModel>
元素。setProfileEnvironment
属性不存在,这会将值默认设置为 true
,或者将属性的值显式设置为 true
。如果应用托管在 IIS 中,密钥将保存到 HKLM 注册表的特殊注册表项中,该注册表项仅列在工作进程帐户的 ACL 中。 使用 DPAPI 对密钥进行静态加密。
如果这些条件都不匹配,则密钥不会保存在当前进程之外。 当进程关闭时,生成的所有密钥都将丢失。
开发人员始终拥有完全控制权,并且可以替代密钥的存储方式和存储位置。 上面的前三个选项应该为大多数应用提供良好的默认值,类似于 ASP.NET <machineKey> 自动生成例程过去的工作方式。 最后的回退选项是唯一需要开发人员在想要保存密钥时预先指定配置的方案,但此回退仅在极少数情况下发生。
在 Docker 容器中托管时,密钥应保存在作为 Docker 卷(在容器生存期过后仍然存在的共享卷或主机装载的卷)的文件夹中或外部提供程序中,例如 Azure Key Vault 或 Redis。 外部提供程序在应用无法访问共享网络卷的 Web 场方案中也很有用(有关详细信息,请参阅 PersistKeysToFileSystem)。
警告
如果开发人员重写上述规则,并将数据保护系统指向特定密钥存储库,则会禁用静态密钥的自动加密。 可以通过配置重新启用静态保护。
默认情况下,密钥的生存期为 90 天。 当密钥过期时,应用会自动生成一个新密钥并将新密钥设置为活动密钥。 只要停用的密钥保留在系统上,应用就可以解密受这些密钥保护的任何数据。 有关详细信息,请参阅密钥管理。
使用的默认有效负载保护算法为 AES-256-CBC(保证机密性)和 HMACSHA256(保证真实性)。 系统使用每 90 天更改一次的 512 位主密钥,根据每个有效负载派生用于这些算法的两个子密钥。 有关详细信息,请参阅子密钥派生。
文档
了解如何在 ASP.NET Core 中配置数据保护。
了解如何为你不能或不想使用依赖项注入提供的服务的数据保护方案提供支持。
浏览介绍如何在 ASP.NET Core 中配置数据保护的主题。
培训
模块
Azure Key and Certificate Management - Training
In this module, you learn about essential concepts for using encryption keys and digital certificates in Azure to help secure cloud workloads and ensure data sovereignty.
认证
Microsoft Certified: Information Protection and Compliance Administrator Associate - Certifications
演示保护 Microsoft 365 部署的数据安全、生命周期管理、信息安全和合规性基础知识。
活动