Question :如何使用存储在数据库中的数据保护密钥而不是Asp.Net Framework 4.x和Asp.Net Core 2网站的文件系统或文件共享来加密身份验证cookie?

Context :我有一个.Net Framework 4.x网站和一个.Net Core 2.0网站 . 我需要在这两个应用程序之间共享身份验证cookie,并使用DataProtection密钥加密数据 .
在 生产环境 中,这些应用程序托管在多个Web服务器上 . 所以,我还需要在服务器之间共享密钥,因此需要共享数据库 . 目前,数据保护密钥在每个服务器上的文件系统位置上手动同步 . 我希望每个Web服务器都可以使用的数据保护密钥的公共位置 . 显而易见的解决方案是文件共享,但这会给架构带来单点故障 .
我宁愿使用支持这两个应用程序的通用数据库 . 我知道数据库本身就是一个SPoF,但它已经并且永远都是 .
为此目的使用它不会增加风险 .

我知道我可以创建自己的IXmlRepository实现,获取并保存数据保护密钥到我的数据库 .
我做到了这一点,效果很好 . 在调试期间,我可以看到应用程序在我的数据库中获取和设置数据保护密钥 .

我在StartUp.cs中使用它,其中DataProtectionRepository是我对数据库的实现:

services.AddSingleton<IXmlRepository, DataProtectionRepository>();
var serviceProvider = services.BuildServiceProvider();
services.AddDataProtection().AddKeyManagementOptions(opt =>
            opt.XmlRepository =
                new DataProtectionRepository(serviceProvider.GetService<DataProtectionContext>()));

问题是当我设置CookieAuthenticationOptions时,TicketDataFormat属性需要构造IDataProtector的实现 . IDataProtector由DataProtectionProvider.CreateProtector提供,但是要创建数据保护提供程序,需要一个DirectoryInfo对象,指示要存储密钥的位置 .

var securityOptions = 
services.BuildServiceProvider().GetService<IOptions<SecurityOptions>>();
var protectionProvider = DataProtectionProvider.Create(new DirectoryInfo(securityOptions.Value.KeyringLocation));
var dataProtector = protectionProvider.CreateProtector("CookieAuthenticationMiddleware", "Federation", "v2");
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
                .AddCookie(options =>
                           {
                               <blah>
                               options.TicketDataFormat = new TicketDataFormat(dataProtector);
                               <blah>
                           });

我想我可以创建自己的IDataProtectionProvider和IDataProtector实现,但这看起来很毛茸茸和危险,因为IDataProtector处理数据有效负载的实际保护和取消保护,但没有公开任何关于如何检索密钥或从哪里获取密钥的细节 . 另外,我真的不想改变任何实际的保护/解除保护功能 . 我只想从我的存储库中检索密钥 .

我很难相信我对这个问题很独特 . 我完全走错了路吗?是否有替代解决方案或者我应该放入文件共享并继续?

谢谢 .