gpt4 book ai didi

c# - .Net Core Machine Key 替代 webfarm

转载 作者:IT老高 更新时间:2023-10-28 12:42:38 29 4
gpt4 key购买 nike

我一直在使用 dotnet core 创建一个在 Linux 主机上的 Kubernetes 集群中运行的应用程序。在我测试时,它注意到在验证 CSRF token 时出现异常,这是有道理的,因为我还没有将机器 key 编辑为在每个实例上都相同。当我继续在 web.config 中设置机器 key 时,我注意到这在 .Net Core 中不再起作用。

由于现在使用 DataProtection API,机器 key 不再起作用。我尝试在我的应用程序中实现 api,但是当我阅读时,我需要使用网络共享来交换所有实例之间的 key ,我惊呆了。当然必须有一种更简单(更好)的方法来实现这一点,而不必依赖共享来在线对吧?

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

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

我以某种方式期望使用应用程序名称生成 key ,但这并没有解决问题。

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

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

有谁知道这个问题的解决方案,它也可以在 Linux 上运行,并且能够通过网络在实例之间共享 token ?

提前致谢!

最佳答案

我做了一些测试来支持我关于复制 key 的评论。首先,我使用以下代码创建了简单的控制台应用程序:

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 容器,使用特定文件夹为 key 注册数据保护,解决和保护某些内容。

这在目标文件夹中生成了以下 key 文件:

<?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>

如您所见,文件相对简单。它说明了创建、激活、到期日期、使用的算法、对反序列化器类的引用,当然还有 key 本身。

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

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

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

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

关于c# - .Net Core Machine Key 替代 webfarm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43326061/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com