当前位置:  开发笔记 > 后端 > 正文

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

如何解决《MVC6WebFarm:无法解密防伪令牌》经验,为你挑选了1个好方法。

我在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> Maxime Rouil..:

说明

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

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

对于本地运行的应用程序,它们存储在运行应用程序%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));
});

资源

静态密钥加密

默认设置


我将注意到,似乎可以通过调用"PersistKeysToFileSystem"并指定本地路径并在我的测试环境中运行它来生成密钥文件来滥用API.如果我然后将该密钥文件复制到webfarm中的所有机器(在相同的相对路径上),它似乎也可以工作.显然,这对于旋转旧密钥不起作用,但是如果有足够长的到期时间,那么部分内容不是问题.当然,这一切似乎都绕过了API提供的许多好处,但我认为为了讨论我还是会提到它.
推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有