Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc MVC 6 WebFarm:无法解密反伪造令牌_Asp.net Mvc_Iis_Asp.net Core_Asp.net Core Mvc - Fatal编程技术网

Asp.net mvc MVC 6 WebFarm:无法解密反伪造令牌

Asp.net mvc MVC 6 WebFarm:无法解密反伪造令牌,asp.net-mvc,iis,asp.net-core,asp.net-core-mvc,Asp.net Mvc,Iis,Asp.net Core,Asp.net Core Mvc,我在一个webfarm场景中运行MVC6(vNext)(带有多个AppServer的ARR前端)。服务器关联已关闭 当我在应用服务器之间从一个请求跳转到另一个请求时,我得到了错误 加密异常:在密钥环中未找到密钥{3275ccad-973d-43ca-930f-fbac4d276640} InvalidOperationException:无法解密反伪造令牌 以前,我相信这是通过在web.config中设置一个静态MachineKey来处理的 据我所知,我们现在使用了一种新的DataProtect

我在一个webfarm场景中运行MVC6(vNext)(带有多个AppServer的ARR前端)。服务器关联已关闭

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

加密异常:在密钥环中未找到密钥{3275ccad-973d-43ca-930f-fbac4d276640}

InvalidOperationException:无法解密反伪造令牌

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

据我所知,我们现在使用了一种新的DataProtection API,我尝试了以下方法,认为应用程序名称用作某种种子:

        services.AddDataProtection();
        services.ConfigureDataProtection(configure =>
        {                
            configure.SetApplicationName("WebAppName");
        });
这并不能解决问题

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

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

如果您在Azure上,则密钥由
%HOME%\ASP.NET\DataProtection keys
上的NAS类型存储同步

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

如果上述条件均不匹配,则在进程的生命周期内生成密钥

解决方案 因此第一个选项不可用(仅限Azure)。但是,您可以在运行应用程序的每台计算机上同步运行应用程序的用户的
%LOCALAPPDATA%\ASP.NET\DataProtection keys
中的密钥

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

sc.ConfigureDataProtection(配置=>
{
//将密钥持久化到特定目录
configure.persistenkeystem(新的DirectoryInfo(@“Z:\temp keys\”);
});
这将允许您在保持安全性的同时进行扩展

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

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

services.ConfigureDataProtection(配置=>
{
//使用14天寿命而不是90天寿命
configure.SetDefaultKeyLifetime(TimeSpan.FromDays(14));
});
来源

太棒了。非常感谢。这是一个内部部署(非azure)。那么,有了这个选项,我们是不是说除非网络共享在线,否则应用程序无法运行?与machineconfig键相比,似乎是一个脆弱的关键点,否?是和否。如果经常访问应用程序,则会提前2天生成这些键,一旦读取这些键,所有操作都来自内存。他们会将这些密钥缓存在内存中,直到需要再次更新。谢谢!因此,除了网络共享之外,现在没有其他机制可以在机器之间共享密钥了?是的,有,但你现在离核心更近了。存在一个用于更改存储的接口。内存中有3个内置的:注册表。您可以重新实现自己的API,并在
ConfigureServices
部分中对其进行定义。我将注意到,通过调用“PersistKeyFilesystem”并指定本地路径并在我的测试环境中运行它来生成密钥文件,似乎有可能滥用API。如果我随后将该密钥文件复制到webfarm中的所有机器上(在相同的相对路径上),它似乎也能工作。显然,这不适用于转出旧密钥,但由于过期时间足够长,因此这一部分不成问题。当然,这一切似乎都忽略了API提供的许多好处,但为了讨论起见,我想我还是要提到它。除了公认的答案,现在很容易在Redis上保留数据保护密钥,这在Web场场景中非常有效。看见