MVC 6 WebFarm:无法解密防伪令牌

时间:2015-12-16 18:47:02

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

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

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

  

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

     

InvalidOperationException:无法解密防伪签名。

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

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

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

这不能解决问题。

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

1 个答案:

答案 0 :(得分:7)

说明

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

如果您使用的是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));
});

来源