50

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

我做了一些研究,似乎经过验证的 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
4

14 回答 14

34

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

于 2015-09-15T14:33:26.603 回答
34

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

于 2016-07-19T14:40:30.107 回答
20

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

catch (CryptographicException cex)
{
    FormsAuthentication.SignOut();
}
于 2014-10-05T17:02:14.590 回答
9

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

于 2017-01-23T07:29:01.897 回答
8

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

在IIS中设置机器;

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

于 2015-03-12T10:32:59.213 回答
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

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

  • 框架20SP1。此值指定 ASP.NET 使用早于 2.0 SP2 的 ASP.NET 版本中可用的加密方法。如果任何服务器的 .NET Framework 版本早于 2.0 SP2,请将此值用于 Web 场中的所有服务器。这是默认值,除非应用程序 Web.config 文件将 httpRuntime 元素的 targetFramework 属性设置为“4.5”。
  • 框架20SP2。此值指定 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”,则这是默认值。
于 2016-11-23T18:46:45.050 回答
7

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

于 2018-02-23T08:59:39.420 回答
6

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

于 2015-12-04T07:22:31.500 回答
5
       protected void Application_Error(object sender_, CommandEventArgs e_)
    {
        Exception exception = Server.GetLastError();
        if(exception is CryptographicException)
        {
            FormsAuthentication.SignOut();
        }
    }

只要您使用表单身份验证(登录名/密码),在您的 Global.asax.cs 中,从捕获错误 Global.asax中。为我工作。

于 2017-08-31T13:12:52.327 回答
2

如果您在实施单点登录时收到此错误(如此处所述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 为我解决了这个问题。

于 2016-06-29T05:48:37.577 回答
1

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

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

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

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

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

于 2018-04-03T11:31:13.063 回答
0

我有同样的问题:MVC 5 ASP.Net Web Application .net Framework 4.6.1

解决方案:

  1. 转到 App_Data 文件夹(解决方案资源管理器)
  2. 双击您的 NAME.mdf(此操作打开服务器资源管理器选项卡)
  3. 右键单击 UserTokenCaches 表并查看 Show Table Data
  4. 删除行
  5. 再次运行应用程序,一切都会好起来的
于 2017-06-10T18:13:12.763 回答
0

对我来说,这是导致兼容性问题的原因。当 webApi 使用时,我的应用程序没有在 web.config 中<httpRuntime targetFramework="4.7.2"/>使用 targetFramework="4.7.2" 参数。从 WebApi 中删除参数或在应用程序中添加参数确实诀窍。<httpRuntime targetFramework="4.7.2"/><httpRuntime targetFramework="4.7.2"/>

于 2020-05-18T11:43:00.690 回答
0

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

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

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

于 2020-12-01T14:41:50.570 回答