TL;DR;
当您在 IIS 中使用没有用户配置文件的工作进程帐户运行应用程序时,ASP.NET Core 数据保护系统将其密钥存储在哪个注册表配置单元中
看起来它正在重用 ASP.NET DPAPI 使用的配置单元,是吗?
我们正在设置一组需要协同工作的 asp.net core 应用程序,而防伪验证目前对 POST 请求造成了干扰。看起来ASP.NET core 需要配置数据保护以便所有应用程序都使用相同的密钥。
我们所有的应用程序当前都与一个池用户一起运行,该池用户既不是用户配置文件,也不是HKLM 注册表密钥环好像是可用的。
我们不允许为这些池用户激活用户配置文件,因此我们希望使用注册表。
在“使用 IIS 在 Windows 上托管 ASP.NET Core”文档的“数据保护”部分中这里我们发现,要在 IIS 下配置数据保护以保留密钥环,其中一种方法是使用来自 github 的 powershell 脚本创建数据保护注册表项这里:
这个脚本的调用方式如下:
Provision-AutoGenKeys "4.0" "32" $poolSid
阅读此 powershell 脚本似乎它所做的就是在以下键上为池用户设置 ACL:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\2.0.50727.0\AutoGenKeys
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\4.0.30319.0\AutoGenKeys
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\ASP.NET\2.0.50727.0\AutoGenKeys
HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\ASP.NET\4.0.30319.0\AutoGenKeys
这就是我完全感到困惑的地方......这些看起来像是 ASP.NET 加密的“旧”自动生成密钥的配置单元,而不是 ASP.NET Core......
所以,我想知道......微软是否会重复使用这些配置单元来进行 ASP.NET Core 数据保护?
或者我应该去别处看看?
答案1
ASP.NET Core 几乎可以在任何地方存储密钥:
- 文件系统
- Windows 注册表
- IIS 用户配置文件(其中的密钥可以保留在 HKLM 注册表中的特殊注册表项中,该注册表项仅对工作进程帐户具有 ACL。密钥使用 DPAPI 进行静态加密)
- Azure KeyVault,Azure 存储帐户
- Azure 应用密钥(位于 %HOME%\ASP.NET\DataProtection-Keys)
- SQL 存储
- Redis 缓存
- 用户配置文件(如果用户配置文件可用,则密钥位于 %LOCALAPPDATA%\ASP.NET\DataProtection-Keys 文件夹中,并使用适用于 Windows 的 DPAPI 进行静态加密)
因此您应该查看与您的案例/配置相对应的位置。
答案2
实践才能证明事实……
我做了一个简单的测试是的这.NET CORE 数据保护系统是重复使用旧的 ASP.NET AutoGenKeys 配置单元为了Microsoft.AspNetCore.数据保护.密钥管理。
在测试中,使用以下配置单元添加数据
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\4.0.30319.0\AutoGenKeys\S-1-5-21-1112422158-284577691-398547282-74630\DataProtection
更详细地说明我的测试:
- 我有两个互相发布信息的简单.net 核心应用程序。
- 每个应用程序都配置了自己的应用程序池。
- 每个应用程序池配置相同的用户。
- 该池用户没有用户配置文件且权限有限......
当我添加 AntiforgeryValidation(其底层使用 .net 核心数据保护)时,调用开始失败。
应用程序日志显示如下条目:
我一跑预配-AutoGenKeys.ps1powershell 脚本(来自https://github.com/aspnet/AspNetCore/blob/master/src/DataProtection/Provision-AutoGenKeys.ps1) 将 ACL 添加到旧的 ASP.NET AutoGenKeys 后,一切开始工作......不再有 HKLM 注册表不可用的警告。
因此,回答我自己的问题:是的.. .NET CORE 数据保护正在为 Microsoft.AspNetCore.DataProtection.KeyManagement 重用旧的 ASP.NET AutoGenKeys 配置单元。