.Net核心机器webfarm的关键替代品

我一直在使用dotnet核心来创build一个在Linux主机上的Kubernetes集群中运行的应用程序。 在我testing的时候,注意到在validationCSRF令牌的时候出现exception,这是有道理的,因为我没有在每个实例上编辑机器密钥。 当我继续在web.config中设置机器密钥,我注意到这将不再在.Net核心工作。

现在正在使用DataProtection API,机器密钥不再有效。 我尝试将API应用到我的应用程序中,但是当我阅读时,我需要使用networking共享来交换我被惊呆的所有实例之间的密钥。 当然,必须有一个更容易(更好)的方式来实现这一点,而不必依靠股票在线上的权利?

我尝试在ConfigureServices方法的Startup类中设置以下内容:

services.AddDataProtection().SetApplicationName("DockerTestApplication");

我以某种方式期望使用应用程序名称来生成密钥,但是这不能解决问题。

我发现一些有趣的文档,都使用不再编译的代码,我想微软改变了一些东西:

https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/compatibility/replacing-machinekey

有没有人知道这个问题的解决scheme,也将在Linux上运行,并有能力通过networking共享令牌之间的实例?

提前致谢!

Solutions Collecting From Web of ".Net核心机器webfarm的关键替代品"

我做了一些测试来备份我关于复制密钥的评论。 首先我用下面的代码创建了简单的控制台应用程序

 var serviceCollection = new ServiceCollection(); serviceCollection.AddDataProtection() .SetApplicationName("my-app") .PersistKeysToFileSystem(new DirectoryInfo(@"G:\tmp\so\keys")); var services = serviceCollection.BuildServiceProvider(); var provider = services.GetService<IDataProtectionProvider>(); var protector = provider.CreateProtector("some_purpose"); Console.WriteLine(Convert.ToBase64String(protector.Protect(Encoding.UTF8.GetBytes("hello world")))); 

因此,只需创建DI容器,在那里为具有特定文件夹的键注册数据保护,解析和保护某些内容。

这在目标文件夹中生成以下密钥文件:

 <?xml version="1.0" encoding="utf-8"?> <key id="e6cbce11-9afd-43e6-94be-3f6057cb8a87" version="1"> <creationDate>2017-04-10T15:28:18.0565235Z</creationDate> <activationDate>2017-04-10T15:28:18.0144946Z</activationDate> <expirationDate>2017-07-09T15:28:18.0144946Z</expirationDate> <descriptor deserializerType="Microsoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AuthenticatedEncryptorDescriptorDeserializer, Microsoft.AspNetCore.DataProtection, Version=1.1.1.0, Culture=neutral, PublicKeyToken=adb9793829ddae60"> <descriptor> <encryption algorithm="AES_256_CBC" /> <validation algorithm="HMACSHA256" /> <masterKey p4:requiresEncryption="true" xmlns:p4="http://schemas.asp.net/2015/03/dataProtection"> <!-- Warning: the key below is in an unencrypted form. --> <value>rVDib1M1BjbCqGctcP+N25zb+Xli9VWX46Y7+9tsoGywGnIg4p9K5QTM+c388i0mC0JBSLaFS2pZBRdR49hsLQ==</value> </masterKey> </descriptor> </descriptor> </key> 

正如你所看到的,文件相对简单。 它指出了创建,激活,到期日期,使用的算法,对反序列化程序类的引用,当然还有键本身。

现在我配置了asp.net应用程序(所以,另一个应用程序,不是那个控制台),像这样:

 services.AddDataProtection() .SetApplicationName("my-app") .PersistKeysToFileSystem(new DirectoryInfo(@"G:\tmp\so\keys-asp")) .DisableAutomaticKeyGeneration(); 

如果您现在尝试运行应用程序并执行需要保护的操作,则会失败,因为没有键和自动密钥生成被禁用。 但是,如果我将由控制台应用程序生成的密钥复制到目标文件夹 – 它将愉快地使用它们。

因此,请注意通常的复制密钥的安全问题,这些密钥的过期时间(可以使用SetDefaultKeyLifetime配置),以及在与您共享密钥的所有应用程序中使用相同版本的Microsoft.AspNetCore.DataProtection (因为它的版本是在xml中指定的文件) – 你应该没问题。 最好在一个地方和所有其他地方设置DisableAutomaticKeyGeneration来生成共享密钥。