"加密操作期间发生错误"解密Forms cookie时

时间:2014-09-15 21:58:59

标签: c# asp.net .net cryptographicexception

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

我已经完成了一些研究,似乎formuthenticated cookie绑定到MachineKey(使用webhost时有所不同)。


我找到了一种方法可以解决这个问题,但错误仍然存​​在
CODE:

/// <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

14 个答案:

答案 0 :(得分:23)

对于尚未解决问题的人,我在web.config中错过了加密/解密的“machineKey”条目

答案 1 :(得分:22)

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

答案 2 :(得分:17)

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

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

答案 3 :(得分:7)

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

在IIS中设置计算机;

  

转到您的应用程序 - &gt;机器钥匙 - &gt;生成密钥

答案 4 :(得分:5)

当我尝试使用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版本中提供的加密方法。如果任何服务器具有早于2.0 SP2的.NET Framework版本,请将此值用于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场中的所有服务器。
  • Framework45 即可。 ASP.NET 4.5的加密增强功能正在生效。如果应用程序Web.config文件的httpRuntime元素的targetFramework属性设置为“4.5”,则这是默认值。

答案 5 :(得分:5)

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

答案 6 :(得分:3)

在开发新解决方案并在localhost上运行网站时,我也遇到过这种情况。设置machinekey没有区别,但只是删除localhost的所有cookie解决了这个问题。

答案 7 :(得分:3)

       protected void Application_Error(object sender_, CommandEventArgs e_)
    {
        Exception exception = Server.GetLastError();
        if(exception is CryptographicException)
        {
            FormsAuthentication.SignOut();
        }
    }
只要您使用Forms身份验证(登录/密码),就可以在Catching errors in Global.asax的Global.asax.cs中

。为我工作。

答案 8 :(得分:3)

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

答案 9 :(得分: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为我解决了问题。

答案 10 :(得分:1)

验证AntiForgery令牌时,我收到了加密错误。

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

对于虚拟内存回收而言,这绝对太少了。私有内存使用量可以设置为1,000,000 KB,但虚拟内存应该有更多的空间。

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

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

答案 11 :(得分:0)

我有同样的问题: MVC 5 ASP.Net Web应用程序.net Framework 4.6.1

解决方案:

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

答案 12 :(得分:0)

对我来说,是<httpRuntime targetFramework="4.7.2"/>引起了兼容性问题。当webApi使用{{时,我的应用程序未在web.config的<httpRuntime targetFramework="4.7.2"/>中使用targetFramework =“ 4.7.2”参数。 1}}。从WebApi中删除参数或在应用程序中添加参数就可以了。

答案 13 :(得分:0)

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

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

加密算法隐藏在“机器密钥”部分(使用IIS)中。也许也可以在web.config中进行设置。