【问题标题】:"Error occurred during a cryptographic operation" when decrypting Forms cookie解密 Forms cookie 时出现“加密操作期间出错”
【发布时间】:2025-10-25 07:20:01
【问题描述】:

我已将我的网站上传到虚拟主机,但出现此错误;
'加密操作期间发生错误。'。

我做了一些研究,似乎经过验证的 cookie 绑定到 MachineKey(使用 webhost 时会有所不同)。


我找到了可以解决此问题的方法,但错误仍然存​​在。

代码:

/// <summary>
    /// This method removes a cookie if the machine key is different than the one that saved the cookie;
    /// </summary>
    protected void Application_Error(object sender, EventArgs e)
    {
        var error = Server.GetLastError();
        var cryptoEx = error as CryptographicException;
        if (cryptoEx != null)
        {
            FederatedAuthentication.WSFederationAuthenticationModule.SignOut();
            Global.Cookies.FormAuthenticated Cookie = new Global.Cookies.FormAuthenticated();
            Cookie.Delete();
            Server.ClearError();
        }
    }


堆栈跟踪:

[CryptographicException: Error occurred during a cryptographic operation.]
   System.Web.Security.Cryptography.HomogenizingCryptoServiceWrapper.HomogenizeErrors(Func`2 func, Byte[] input) +115
   System.Web.Security.Cryptography.HomogenizingCryptoServiceWrapper.Unprotect(Byte[] protectedData) +59
   System.Web.Security.FormsAuthentication.Decrypt(String encryptedTicket) +9824926
   Archive_Template.Main.resolveLoginUser(String sessionKey) in f:\Archive_Template\Archive_Template\Main.aspx.cs:481
   Archive_Template.Main.OnPreInit(EventArgs e) in f:\Archive_Template\Archive_Template\Main.aspx.cs:52
   System.Web.UI.Page.PerformPreInit() +31
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +335

【问题讨论】:

  • 如果您使用 Microsoft 的服务器端 ADAL 库,请参阅@FRoZeN 的回答(从 SQL 'UserTokenCaches' 表中删除缓存的令牌)
  • 如果您正在进行客户端脚本/SPA 开发,请参阅 @BaqerNaqvi 的回答 - 清除浏览器的 localStorage ADAL.js 存储和缓存它的 API 访问令牌应该有助于解决问题

标签: c# asp.net .net cryptographicexception


【解决方案1】:

如果您使用的是表单身份验证。您可以在捕获异常时退出并允许您的用户登录并创建有效的 cookie

catch (CryptographicException cex)
{
    FormsAuthentication.SignOut();
}

【讨论】:

  • 你好,我也有同样的问题,你能告诉我我应该把这段代码放在我的控制器哪里来捕获这个错误吗?
  • 在您的Global.asax 文件中
【解决方案2】:

这是由于缺少机器密钥,该机器密钥用作对称密钥进行加密和解密。

在IIS中设置机器;

转到您的应用程序 -> 机器密钥 -> 生成密钥

【讨论】:

    【解决方案3】:

    对于尚未解决问题的任何人,我的 web.config 中缺少用于加密/解密的“machineKey”条目

    【讨论】:

    • 你能扩展这个答案吗?你使用了什么特定的配置?这个可以用iis配置吗?
    • 您可以在 WebConfig 的 system.web 部分中添加类似的内容。 但是,这并不能永久解决问题。检查 *.com/questions/14119965/… 中的 cmets 和 IIS blogs.msdn.microsoft.com/amb/2012/07/31/…
    • 我在将站点移动到具有两个 Web 服务器的 Web 场时遇到了这个问题。正如 andreasnico 的回答所建议的那样,这个答案,使用 Juan Acosta 的链接,加上仅清除该站点的缓存数据和 cookie(我使用浏览器开发人员工具完成了这个),解决了这个问题。谢谢。
    【解决方案4】:

    我在开发新解决方案并在 localhost 上运行网站时也遇到过这种情况。设置机器密钥没有任何区别,但只需删除 localhost 的所有 cookie 即可解决问题。

    【讨论】:

      【解决方案5】:

      如果您在实施单点登录时收到此错误(如此处所述http://www.alexboyang.com/2014/05/28/sso-for-asp-net-mvc4-and-mvc5-web-apps-shared-the-same-domain/),请确保所有项目具有相同的目标框架。我有一个项目使用 .NET 4.0,另一个项目使用 .NET 4.5.2。

      将第一个更改为 4.5.2 为我解决了这个问题。

      【讨论】:

      • 进入项目并再次指定 .Net 4.5.2 似乎也为我解决了这个问题。
      【解决方案6】:

      我遇到了同样的问题。 我刚刚清除了所有浏览器的 cookie缓存数据,它已得到修复。我希望它也对您有用。

      【讨论】:

      • 谢谢!修复了我的问题
      • 我也遇到了这个问题,清除 cookie 有效。 Stack Trace 消息有很多关于会话安全和会话身份验证的调用。 Cookie 绝对是问题所在!
      【解决方案7】:

      当我尝试获取由 ASP.NET 2.0 应用程序创建的表单身份验证 cookie 并在 .NET4.5 Web API 项目中对其进行解密时遇到了这个问题。解决方案是在我的 web api 的 web.config 文件中的“machineKey”节点中添加一个名为“compatibilityMode”的属性:

      <machineKey 
      ...
      compatibilityMode="Framework20SP2"/>
      

      文档:https://msdn.microsoft.com/en-us/library/system.web.configuration.machinekeysection.compatibilitymode.aspx

      从文档中,这里是该属性的允许值:

      • Framework20SP1。此值指定 ASP.NET 使用早于 2.0 SP2 的 ASP.NET 版本中可用的加密方法。如果任何服务器的 .NET Framework 版本早于 2.0 SP2,请将此值用于 Web 场中的所有服务器。这是默认值,除非应用程序 Web.config 文件将 httpRuntime 元素的 targetFramework 属性设置为“4.5”。
      • Framework20SP2。此值指定 ASP.NET 使用 .NET Framework 2.0 SP2 中引入的升级加密方法。如果所有服务器都有 .NET Framework 2.0 SP2 或更高版本,但至少有一个没有 .NET Framework 4.5,则对 Web 场中的所有服务器使用此值。
      • 框架45。 ASP.NET 4.5 的加密增强功能已生效。如果应用程序 Web.config 文件将 httpRuntime 元素的 targetFramework 属性设置为“4.5”,则这是默认值。

      【讨论】:

      【解决方案8】:

      我也有这个,我从数据库中删除了 UserTokenCaches 表条目。

      【讨论】:

      • 是的,对于来自 Microsoft 的 ADAL 库的用户。删除缓存在数据库中的令牌。就像@FRoZeN 在这里所说的那样
      【解决方案9】:

      我遇到了同样的问题: MVC 5 ASP.Net Web 应用程序 .net 框架 4.6.1

      解决方案:

      1. 转到 App_Data 文件夹(解决方案资源管理器)
      2. 双击您的 NAME.mdf(此操作打开服务器资源管理器选项卡)
      3. 右击UserTokenCaches表,查看Show Table Data
      4. 删除行
      5. 再次运行应用,一切都会好的

      【讨论】:

        【解决方案10】:
               protected void Application_Error(object sender_, CommandEventArgs e_)
            {
                Exception exception = Server.GetLastError();
                if(exception is CryptographicException)
                {
                    FormsAuthentication.SignOut();
                }
            }
        

        在您的 Global.asax.cs 中,来自 Catching errors in Global.asax,只要您使用表单身份验证(登录名/密码)。为我工作。

        【讨论】:

          【解决方案11】:

          另一个选项是从浏览器设置中清除 cookie,这样可以存储新的 cookie。

          【讨论】:

          • 关闭了我所有的浏览器,打开一个新的,这个问题就消失了
          【解决方案12】:

          验证 AntiForgery 令牌时出现加密错误。

          我相信这是因为我刚刚对我的服务器进行了一些安全控制配置更改,以配置应用程序回收,以便在虚拟内存限制达到 1,000,000 千字节时进行回收。

          这对于虚拟内存回收来说绝对是太少了。私有内存使用量可以设置为 1,000,000 KB,但应为虚拟内存提供更多空间。

          我注意到我的应用程序经常被回收。

          我将虚拟内存限制增加到 10,000,000 KB,这些错误就消失了。我相信在我填写表格时,应用程序池可能已被回收。

          【讨论】:

            【解决方案13】:

            对我来说,是 &lt;httpRuntime targetFramework="4.7.2"/&gt; 导致了兼容性问题。当 webApi 使用 &lt;httpRuntime targetFramework="4.7.2"/&gt; 时,我的应用程序没有使用 web.config 中 &lt;httpRuntime targetFramework="4.7.2"/&gt; 中的 targetFramework="4.7.2" 参数。删除来自 WebApi 的参数或在应用程序中添加参数就可以了。

            【讨论】:

              【解决方案14】:

              当有人决定将加密算法更改为 DES(一种非常古老的加密标准)时,我遇到了这个问题。将其移回 AES(一种更现代的加密标准)即可清除错误。

              可能与禁用 DES 的组策略有关...

              加密算法隐藏在机器密钥部分(使用 IIS)。可能还有一种方法可以在 web.config 中进行设置。

              【讨论】:

                最近更新 更多