Asp.net mvc MVC 6 WebFarm:无法解密反伪造令牌
我在一个webfarm场景中运行MVC6(vNext)(带有多个AppServer的ARR前端)。服务器关联已关闭 当我在应用服务器之间从一个请求跳转到另一个请求时,我得到了错误 加密异常:在密钥环中未找到密钥{3275ccad-973d-43ca-930f-fbac4d276640} InvalidOperationException:无法解密反伪造令牌 以前,我相信这是通过在web.config中设置一个静态MachineKey来处理的 据我所知,我们现在使用了一种新的DataProtection API,我尝试了以下方法,认为应用程序名称用作某种种子: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
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));
});
来源
ConfigureServices
部分中对其进行定义。我将注意到,通过调用“PersistKeyFilesystem”并指定本地路径并在我的测试环境中运行它来生成密钥文件,似乎有可能滥用API。如果我随后将该密钥文件复制到webfarm中的所有机器上(在相同的相对路径上),它似乎也能工作。显然,这不适用于转出旧密钥,但由于过期时间足够长,因此这一部分不成问题。当然,这一切似乎都忽略了API提供的许多好处,但为了讨论起见,我想我还是要提到它。除了公认的答案,现在很容易在Redis上保留数据保护密钥,这在Web场场景中非常有效。看见