【问题标题】:Using Antiforgery in ASP.NET Core and got error - the antiforgery token could not be decrypted在 ASP.NET Core 中使用 Antiforgery 并出现错误 - 无法解密防伪令牌
【发布时间】:2017-06-25 11:22:08
【问题描述】:

我的 ASP.Net Core 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: 无法使用防伪令牌 解密。 ---> System.Security.Cryptography.CryptographicException: {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx} 在 钥匙圈。

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

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

  • 这有效,但是一旦您将 web.config 条目从 &lt;environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Development" /&gt; 更改为 &lt;environmentVariable name="ASPNETCORE_ENVIRONMENT" value="Test" /&gt; 它就不再有效并产生以下警告:System.Security.Cryptography.CryptographicException: The key {4ec49003-9829-4b03-bf2f-5756943cff99} was not found in the key ring
【解决方案2】:

我有这个是因为我开始在 localhost 端口上使用该应用程序,然后尝试在具有相同端口的 docker 中使用它。到那时,我的 cookie 指定了我的机器生成的密钥,所以它不能在 docker 上工作。

TL;DR如果您曾在其他机器上使用过该域/端口,请清除您的 cookie。

【讨论】:

    【解决方案3】:

    对我有用的是使用新用户帐户而不是网络服务,因为错误消息包括:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 解决了我在使用 docker-compose 运行多个应用程序时遇到的问题。我猜数据保护没有实现,ASP.NET 仍然生成了一个伪造令牌并将其添加到 cookie 中。在 docker 内的 Linux 环境中,这些令牌由于某种原因无法使用,因此需要存储它们。但是,在我实现将密钥存储在数据库中之后,我的客户端仍然在 cookie 中有旧的伪造令牌,服务器无法解密它。清除 cookie 并以持久的方式存储密钥解决了我的问题。
      猜你喜欢
      • 1970-01-01
      • 2017-07-21
      • 2023-03-30
      • 2021-12-08
      • 2020-03-09
      • 2022-08-16
      • 2018-06-01
      • 2016-03-23
      相关资源
      最近更新 更多