我在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中解决这个问题吗?
您需要重复使用相同的密钥.
如果您在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));
});
静态密钥加密
默认设置