如何在Linux服务器上处理ValidateAntiForgeryToken

u91tlkcl  于 2023-11-17  发布在  Linux
关注(0)|答案(2)|浏览(118)

我在一些负载平衡的Linux服务器上部署了一个asp.net核心应用程序。由于ValidateAntiForgeryToken属性失败,我在将表单发布到路由时出错(如果POST没有返回到生成表单的同一台机器)。
在Windows和.Net classic中,我知道如何匹配web.configmachine.config文件中的MachineKey属性。
那么,我如何在Linux主机上实现相同的功能,并允许来自一台服务器的令牌在另一台服务器上进行验证?

3ks5zfa0

3ks5zfa01#

因此,当您调用services.addMvc()时,会自动添加防伪支持。您可以通过调用services.AddAntiforgery(opts => "your options")更改基本配置。
在引擎盖下,令牌由ASP.Net Core Data Protection library(github repo here)保护。默认情况下,我认为这是在内存中,因此生成的密钥,然后用于令牌保护,不会在多个/云服务器场景中共享。

解决方案

因此,要共享防伪令牌,您可以使用共享位置设置数据保护服务。数据保护库附带的默认值为:

//File system
services.AddDataProtection()
    .PersistKeysToFileSystem(new DirectoryInfo(@"\\some\shared\directory\"));

//Registry
services.AddDataProtection()
   .PersistKeysToRegistry(Registry.CurrentUser.OpenSubKey(@"SOFTWARE\Sample\keys"));

字符串
然后,有几个默认值可以更好地共享存储:

//redis
var redis = ConnectionMultiplexer.Connect("my-redis-url");
services.AddDataProtection()
    .PersistKeysToRedis(redis, "DataProtection-Keys");

//Azure
services.AddDataProtection()
    .PersistKeysToAzureBlobStorage(new Uri("blob-URI"));


我还发现(并使用!)github thanks to a github user named CL0SeY的AWS S3存储选项。
更新:Amazon发布了他们自己的实现,用于使用AWS SSM参数存储。Github repo here用于测试
默认情况下,令牌的生命周期为90天。这可以在添加服务时设置。因此,获得测试的简单解决方案的一种方法是生成具有长生命周期的文件系统密钥,然后将该令牌部署到服务器上的已知位置。然后从该位置设置数据保护,但告诉它永远不要生成新密钥:

//generate a test key with this in a test app or whatever: 
services.AddDataProtection()
       .PersistKeysToFileSystem(new DirectoryInfo(@"c:\temp\"))
       .SetDefaultKeyLifetime(TimeSpan.MaxValue);

// then use that key in your app:
services.AddDataProtection()
       .PersistKeysToFileSystem(new DirectoryInfo(@"\some\allowed\directory"))
       .DisableAutomaticKeyGeneration();

Linux上

所有这些都应该在Linux上运行,唯一的警告是你不应该引用windows驱动器或位置(duh).我不是100%确定如果你尝试注册表选项会发生什么.

qjp7pelc

qjp7pelc2#

对于任何使用ASP.NET Core的人来说,当使用负载均衡器时,Antiforgery在AWS上是有问题的。Antiforgery作为一个单独的示例在没有任何配置的情况下工作得很好。除了将密钥持久化到文件系统之外,我还必须将目标组设置为使用带有服务器生成的cookie的粘性会话。另一种可能性是使用Entity Core DbContext,它将允许多个应用程序共享一个密钥。

相关问题