【问题标题】:MVC 6 WebFarm: The antiforgery token could not be decryptedMVC 6 WebFarm:无法解密防伪令牌
【发布时间】:2016-03-23 01:09:58
【问题描述】:

我在 webfarm 场景(具有多个 AppServer 的 ARR 前端)中运行 MVC 6 (vNext)。服务器关联性已关闭。

当我在应用服务器之间从一个请求跳转到另一个请求时,我收到了错误

CryptographicException:在密钥环中找不到密钥 {3275ccad-973d-43ca-930f-fbac4d276640}。

InvalidOperationException:无法解密防伪令牌。

以前,我相信这是通过在 web.config 中设置静态 MachineKey 来处理的。

据我了解,我们现在已经转移到新的 DataProtection API,我尝试了以下方法,认为应用程序名称被用作某种种子:

        services.AddDataProtection();
        services.ConfigureDataProtection(configure =>
        {                
            configure.SetApplicationName("WebAppName");
        });

这并不能解决问题。

知道如何在 vNext 中解决这个问题吗?

【问题讨论】:

  • 除了接受的答案之外,现在很容易在 Redis 上持久保存数据保护密钥,这在 Web Farm 场景中运行良好。见tugberkugurlu.com/archive/…

标签: asp.net-mvc iis asp.net-core asp.net-core-mvc


【解决方案1】:

说明

您需要重复使用相同的密钥。

如果您在 Azure 上,则密钥通过%HOME%\ASP.NET\DataProtection-Keys 上的 NAS 类型存储同步。

对于本地运行的应用程序,它们存储在运行应用程序的用户的%LOCALAPPDATA%\ASP.NET\DataProtection-Keys 中,如果在 IIS 中执行,则存储在注册表中。

如果以上都不匹配,则在进程的生命周期内生成密钥。

解决方案

所以第一个选项不可用(仅限 Azure)。但是,您可以在运行您的应用程序的每台机器上同步来自运行您的应用程序的用户的%LOCALAPPDATA%\ASP.NET\DataProtection-Keys 的密钥。

但更好的是,您可以将其指向这样的网络共享:

sc.ConfigureDataProtection(configure =>
{
    // persist keys to a specific directory
    configure.PersistKeysToFileSystem(new DirectoryInfo(@"Z:\temp-keys\"));
});

这将允许您在保持安全性的同时进行扩展。

重要提示:您的密钥将每 90 天过期一次。经常再生它们很重要。

您可以使用这段代码更改它,但越短越安全。

services.ConfigureDataProtection(configure =>
{
    // use 14-day lifetime instead of 90-day lifetime
    configure.SetDefaultKeyLifetime(TimeSpan.FromDays(14));
});

来源

【讨论】:

  • 太棒了。谢谢你。这是一个本地(非天蓝色)部署。那么,有了这个选项,我们是不是说除非网络共享在线,否则应用程序无法运行?与 machineconfig 键相比,这似乎是一个脆弱的关键,不是吗?
  • 是和不是。如果应用程序被频繁访问,密钥会提前 2 天生成,一旦读取,所有操作都来自内存。他们会将这些密钥缓存在内存中,直到需要再次更新它们为止。
  • 谢谢!那么除了网络共享之外,现在没有其他机制可以在机器之间共享密钥了吗?
  • 是的,但你现在更接近核心了。存在用于更改存储的IXmlRepository 接口。有 3 个内置:file、注册表、内存。您可以重新实现自己的并在 ConfigureServices 部分中定义它。
  • 我会注意到,通过调用“PersistKeysToFileSystem”并指定本地路径并在我的测试环境中运行它以生成密钥文件,似乎可以滥用 API。如果我然后将该密钥文件复制到 webfarm 中的所有机器(在相同的相对路径),它似乎也可以工作。显然,这不适用于轮换旧密钥,但如果到期时间足够长,这部分不是问题。当然,这一切似乎都绕过了 API 提供的许多好处,但为了讨论,我还是想提一下。
猜你喜欢
  • 2017-07-21
  • 2023-03-30
  • 2020-03-09
  • 2015-01-11
  • 1970-01-01
  • 1970-01-01
  • 2014-10-03
  • 1970-01-01
相关资源
最近更新 更多