我很难理解数据保护 API。
我想在集群环境(服务结构)中设置一些网络核心 Web 应用程序。以前您要做的只是确保每台计算机的 web.config 中具有相同的密钥。简单的。使用新的数据保护 API 似乎有点(lottle!)更多地参与。
从文档中here看起来它应该像使用适当的证书设置数据保护服务一样简单。
不过我尝试过这个:
public static void Main(string[] args)
{
// add data protection services
var serviceCollection = new ServiceCollection();
string thumbPrint = "XXXXXXXXXXXX";
serviceCollection.AddDataProtection()
.ProtectKeysWithDpapiNG($"CERTIFICATE=HashId:{thumbPrint}", flags: Microsoft.AspNetCore.DataProtection.XmlEncryption.DpapiNGProtectionDescriptorFlags.None);
var services = serviceCollection.BuildServiceProvider();
// create an instance of MyClass using the service provider
var instance = ActivatorUtilities.CreateInstance<MyClass>(services);
instance.RunSample();
}
public class MyClass
{
IDataProtector _protector;
// the 'provider' parameter is provided by DI
public MyClass(IDataProtectionProvider provider)
{
_protector = provider.CreateProtector("Contoso.MyClass.v1");
}
public void RunSample()
{
Console.Write("Enter input: ");
string input = Console.ReadLine();
// protect the payload
string protectedPayload = _protector.Protect(input);
Console.WriteLine($"Protect returned: {protectedPayload}");
// unprotect the payload
string unprotectedPayload = _protector.Unprotect(protectedPayload);
Console.WriteLine($"Unprotect returned: {unprotectedPayload}");
Console.ReadLine();
}
}
我只是得到一个例外
System.InvalidOperationException occurred
HResult=0x80131509
Message=No service for type 'Microsoft.AspNetCore.DataProtection.Repositories.IXmlRepository' has been registered.
经过一番挖掘后发现,这是因为没有为密钥指定持久存储。
这里有什么建议?我是否应该将密钥保存到某个中央位置(即可供我的所有应用程序使用的共享)。如果有,原因是什么?
你必须提供一个实现IXmlRepository
它为数据保护 API 提供了存储密钥的位置。这ProtectKeysWith*()
指令保护静态密钥(基本而言,在保存密钥之前对其进行加密!)。附加信息here.
我最终将密钥保留到 AzureStorage。更多信息here.
serviceCollection.AddDataProtection()
.ProtectKeysWithDpapiNG($"CERTIFICATE=HashId:{thumbPrint}", flags: Microsoft.AspNetCore.DataProtection.XmlEncryption.DpapiNGProtectionDescriptorFlags.None)
.PersistKeysToAzureBlobStorage(/* params */);
还值得注意的是,用于保护密钥的证书must存储在证书存储中,并且运行应用程序的帐户必须具有读取访问权限。看here.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)