我一直在使用dotnet核心来创build一个在Linux主机上的Kubernetes集群中运行的应用程序。 在我testing的时候,注意到在validationCSRF令牌的时候出现exception,这是有道理的,因为我没有在每个实例上编辑机器密钥。 当我继续在web.config中设置机器密钥,我注意到这将不再在.Net核心工作。
现在正在使用DataProtection API,机器密钥不再有效。 我尝试将API应用到我的应用程序中,但是当我阅读时,我需要使用networking共享来交换我被惊呆的所有实例之间的密钥。 当然,必须有一个更容易(更好)的方式来实现这一点,而不必依靠股票在线上的权利?
我尝试在ConfigureServices方法的Startup类中设置以下内容:
services.AddDataProtection().SetApplicationName("DockerTestApplication");
ASP.NET核心发布会在发布的文件夹中产生大量的DLL,为什么?
Linux上的ClientWebSocket引发AuthenticationException(SSL)
Nuget的.net核心在Linux上
如何在Linux上转储.NET核心应用程序
将文件从Linux复制到Windows共享与C#(.NET核心)
我以某种方式期望使用应用程序名称来生成密钥,但是这不能解决问题。
我发现一些有趣的文档,都使用不再编译的代码,我想微软改变了一些东西:
https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/compatibility/replacing-machinekey
有没有人知道这个问题的解决scheme,也将在Linux上运行,并有能力通过networking共享令牌之间的实例?
提前致谢!
停止运行在红隼上运行的dotnet核心网站
.Net核心忽略环境variablesDOTNET_SKIP_FirsT_TIME_EXPERIENCE
如何在Debian Jessie中安装dotnet core sdk
.NET Core中的跨平台文件名处理
在DotNet核心服务堆栈上绕过SSL证书validation
我做了一些测试来备份我关于复制密钥的评论。 首先我用下面的代码创建了简单的控制台应用程序
var serviceCollection = new ServiceCollection(); serviceCollection.AddDataProtection() .SetApplicationName("my-app") .PersistKeysToFileSystem(new DirectoryInfo(@"G:tmpsokeys")); 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:tmpsokeys-asp")) .disableAutomaticKeyGeneration();
如果您现在尝试运行应用程序并执行需要保护的操作,则会失败,因为没有键和自动密钥生成被禁用。 但是,如果我将由控制台应用程序生成的密钥复制到目标文件夹 – 它将愉快地使用它们。
因此,请注意通常的复制密钥的安全问题,这些密钥的过期时间(可以使用SetDefaultKeyLifetime配置),以及在与您共享密钥的所有应用程序中使用相同版本的Microsoft.AspNetCore.DataProtection (因为它的版本是在xml中指定的文件) – 你应该没问题。 最好在一个地方和所有其他地方设置disableAutomaticKeyGeneration来生成共享密钥。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。