在ASP.NET Core中使用Antiforgery并出现错误 - 无法解密防伪令牌

时间:2017-02-08 01:18:18

标签: c# asp.net asp.net-mvc antiforgerytoken

我的ASP.Net核心MVC应用程序添加了 Antiforgery 中间件,如下所示:

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:防伪令牌不可能   解密。 ---&GT; System.Security.Cryptography.CryptographicException:   未找到密钥{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}   钥匙圈。

我找到了一个解决方案,建议在web.config中设置一对静态验证/解密密钥,但似乎这个解决方案仅适用于经典的asp.net应用程序。我该怎么做ASP.Net核心?

5 个答案:

答案 0 :(得分:5)

我在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核心无法保留应用程序的身份。

答案 1 :(得分:0)

之所以这样,是因为我开始在本地主机端口上使用该应用程序,然后尝试在具有相同端口的docker中使用它。到那时,我已经有了cookie,它指定了我的机器生成的密钥,因此它在docker上不起作用。

TL; DR (如果您曾经从其他计算机上使用过该域/端口)清除cookie。

答案 2 :(得分:0)

对我来说(在DEV环境中)正在清除浏览数据。清除之前,我只能通过浏览器隐身模式访问带有此错误的页面。

答案 3 :(得分:0)

对我有用的是使用新的用户帐户而不是NETWORK SERVICE,因为错误消息包括:

System.UnauthorizedAccessException:拒绝访问路径“ C:\ Windows \ system32 \ config \ systemprofile”。

答案 4 :(得分:-2)

我在 azure 上运行 .net core 5 应用程序的 linux 容器中遇到了类似的问题,并以私有模式打开浏览器解决了这个问题。