ASP.Net 集群环境中的核心数据保护 API

ASP.Net Core Data Protection API in a Clustered Environment

我很难理解数据保护 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 */);

还值得注意的是,用于保护密钥的证书必须存储在证书存储中并且应用程序运行下的帐户必须具有读取权限。参见 here