我的ASP.Net MVC的核心应用程序添加了防伪中间件象下面这样:
startup.cs
services.AddMvc();
services.AddSession();
services.AddCaching();
services.AddSession(o =>
{
o.IdleTimeout = TimeSpan.FromMinutes(120);
});
services.AddAntiforgery();
我在视图和控制器中加入以下
视图:
<form action="/Home/Login" method="post" id="staff-login" autocomplete="off">
@Html.AntiForgeryToken()
......
调节器
[HttpPost, ValidateAntiForgeryToken]
public IActionResult Login(IFormCollection formCollection)
{...}
问题是,用户总是得到下面,当用户遇到不同的形式。
System.InvalidOperationException:该防伪标记无法解密。 ---> System.Security.Cryptography.CryptographicException:密钥{XXXXXXXXXXXX-XXXXXXXX-XXXXXXXXXXXX}不是在键环找到。
我发现了一个解决方案,建议设置静态对验证/解密密钥在web.config中,但似乎这种解决方案仅适用于经典的asp.net应用程序。我应该如何在ASP.Net的核心呢?
我已经对托管在一个Linux容器中的ASP .NET应用程序的核心正是这样的错误。
但即使对我是行不通的 - 从docs如果不符合特定标准的密钥只坚持的过程中它似乎。
首先使用默认设置发生错误。 然后我添加特定配置文件系统上的按键:
services.AddDataProtection()
.PersistKeysToFileSystem(new System.IO.DirectoryInfo(@"/var/my-af-keys/"));
这也没修好,我不得不设置应用程序的名称问题:
services.AddDataProtection()
.SetApplicationName("fow-customer-portal")
.PersistKeysToFileSystem(new System.IO.DirectoryInfo(@"/var/dpkeys/"));
我还没有证实,但LXC托管其可能的性质意味着.NET核心不能坚持应用程序的身份。
我有这个,因为我开始使用本地主机端口上的应用程序,然后试图在泊坞窗同一端口使用它。那时我有这样的指定由我的机器生成的密钥的cookie,所以它不会对码头工人的工作。
TL; DR清除Cookie,如果你曾经使用从其他机器域/端口。