为什么 AspNetCore DataProtection Azure 存储使用内键
Why is AspNet Core IDataProtection Azure Storage Using Inner Key
我已经做了几天了,看不出我做错了什么。如果有人能告诉我我做错了什么,我将不胜感激。
我经历了多次迭代。这是我目前无法使用的。
Startup.cs
var creds = new StorageCredentials(settings.CloudStorageAccount, settings.CloudStorageKey);
var account = new CloudStorageAccount(creds, true);
var blobClient = account.CreateCloudBlobClient();
var container = blobClient.GetContainerReference($"{dpsFolder}-{_env.EnvironmentName}".ToLower());
container.CreateIfNotExistsAsync().GetAwaiter().GetResult();
services.AddDataProtection()
.SetApplicationName(settings.ApplicationName)
.PersistKeysToAzureBlobStorage(container, dpsFileName);
控制器构造函数
public ExternalSettingController([FromServices] IExternalSettingRepo repo,
[FromServices] IOptions<AppSettings> opts,
[FromServices] ILogger<ExternalSettingController> logger,
[FromServices] IHostingEnvironment env,
[FromServices] IDataProtectionProvider dpp)
: base(opts, repo, logger)
{
_dataProtector = dpp.CreateProtector("blah.Integration");
}
Get 方法中的实际调用
toReturn.Plain = _dataProtector.Unprotect(found.SettingValue);
一切似乎都加载正常,这是我通过调试器所能知道的最好结果。设置正确。当调用 Unprotect 时,系统选择使用来自 C:\Users\blah\AppData\Local\ASP.NET\DataProtection-Keys 的密钥之一,而不是上传到 Azure Blob Storage 的密钥。
一些背景知识,因为它可能会影响事情。我最初创建了一个单独的 DataProtectionService class,它使用我为项目维护的密钥使用 IDataProtection 进行加密。它不会安装在 Azure 上的可读位置,因此我不得不切换它的存储位置。这是现在 Azure 存储中的关键。当相同的密钥存储在本地时,我尝试解密的数据最初是加密的。
我做错了什么?
我刚刚把标题改成了这个,现在我明白发生了什么事了。其中一部分是我有两个以相同顺序开始的 Guid,这让我感到困惑。一个在我的电脑上。另一个被添加到已上传到 Azure Blob 存储的密钥文件中。
但这并不能解释问题。以下是希望随着时间的推移对其他人有所帮助的解释:
在 Azure Blob 存储下切换到 运行 后,数据保护子系统向 Azure 上的 keys.xml 文件添加了第二个密钥。该键进入已经存在的初始 <key>
元素。它在根 <key>
元素中创建了一个嵌套的 <key>
元素。由于未知原因(可能是错误),Data Protection 中的密钥环代码随后忽略了代表我需要的密钥的根 <key>
元素,并且只加载了嵌套的 <key>
元素。
为了解决这个问题,我切换了它们。新生成的现在是根键,旧的是嵌套键。这样就加载了正确的密钥,现在一切都很开心。
我已经做了几天了,看不出我做错了什么。如果有人能告诉我我做错了什么,我将不胜感激。
我经历了多次迭代。这是我目前无法使用的。
Startup.cs
var creds = new StorageCredentials(settings.CloudStorageAccount, settings.CloudStorageKey);
var account = new CloudStorageAccount(creds, true);
var blobClient = account.CreateCloudBlobClient();
var container = blobClient.GetContainerReference($"{dpsFolder}-{_env.EnvironmentName}".ToLower());
container.CreateIfNotExistsAsync().GetAwaiter().GetResult();
services.AddDataProtection()
.SetApplicationName(settings.ApplicationName)
.PersistKeysToAzureBlobStorage(container, dpsFileName);
控制器构造函数
public ExternalSettingController([FromServices] IExternalSettingRepo repo,
[FromServices] IOptions<AppSettings> opts,
[FromServices] ILogger<ExternalSettingController> logger,
[FromServices] IHostingEnvironment env,
[FromServices] IDataProtectionProvider dpp)
: base(opts, repo, logger)
{
_dataProtector = dpp.CreateProtector("blah.Integration");
}
Get 方法中的实际调用
toReturn.Plain = _dataProtector.Unprotect(found.SettingValue);
一切似乎都加载正常,这是我通过调试器所能知道的最好结果。设置正确。当调用 Unprotect 时,系统选择使用来自 C:\Users\blah\AppData\Local\ASP.NET\DataProtection-Keys 的密钥之一,而不是上传到 Azure Blob Storage 的密钥。
一些背景知识,因为它可能会影响事情。我最初创建了一个单独的 DataProtectionService class,它使用我为项目维护的密钥使用 IDataProtection 进行加密。它不会安装在 Azure 上的可读位置,因此我不得不切换它的存储位置。这是现在 Azure 存储中的关键。当相同的密钥存储在本地时,我尝试解密的数据最初是加密的。
我做错了什么?
我刚刚把标题改成了这个,现在我明白发生了什么事了。其中一部分是我有两个以相同顺序开始的 Guid,这让我感到困惑。一个在我的电脑上。另一个被添加到已上传到 Azure Blob 存储的密钥文件中。
但这并不能解释问题。以下是希望随着时间的推移对其他人有所帮助的解释:
在 Azure Blob 存储下切换到 运行 后,数据保护子系统向 Azure 上的 keys.xml 文件添加了第二个密钥。该键进入已经存在的初始 <key>
元素。它在根 <key>
元素中创建了一个嵌套的 <key>
元素。由于未知原因(可能是错误),Data Protection 中的密钥环代码随后忽略了代表我需要的密钥的根 <key>
元素,并且只加载了嵌套的 <key>
元素。
为了解决这个问题,我切换了它们。新生成的现在是根键,旧的是嵌套键。这样就加载了正确的密钥,现在一切都很开心。