WebResource.axd上的“填充无效且无法删除”异常

时间:2008-11-21 19:18:06

标签: asp.net viewstate webresource.axd

我的ASP.NET 2.0应用程序在我们的本地环境中运行良好。发布到测试服务器时,我们在服务器上出现间歇性错误。

这是最常见的:

填充无效,无法删除。 描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪,以获取有关错误及其在代码中的起源位置的更多信息。

  

异常详细信息:   System.Security.Cryptography.CryptographicException:   填充无效,不可以   除去。

     

来源错误:

     

生成了未处理的异常   在执行当前   网络请求。有关的信息   异常的起源和位置   可以使用例外来识别   堆栈跟踪下面。

     

堆栈追踪:

     

[CryptographicException:Padding is   无效且无法删除。]
  System.Security.Cryptography.RijndaelManagedTransform.DecryptData(字节[]   inputBuffer,Int32 inputOffset,Int32   inputCount,Byte []& OutputBuffer中,   Int32 outputOffset,PaddingMode   paddingMode,Boolean fLast)+1545747
  System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock(字节[]   inputBuffer,Int32 inputOffset,Int32   inputCount)+257
  System.Security.Cryptography.CryptoStream.FlushFinalBlock()   +30 System.Web.Configuration.MachineKeySection.EncryptOrDecryptData(布尔值   fEncrypt,Byte [] buf,Byte []修饰符,   Int32 start,Int32 length,Boolean   useValidationSymAlgo)+164
  System.Web.UI.Page.DecryptString(字符串   s)+83
  System.Web.Handlers.AssemblyResourceLoader.System.Web.IHttpHandler.ProcessRequest(HttpContext的   上下文)+148
  System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()   +358 System.Web.HttpApplication.ExecuteStep(IExecutionStep   步,布尔& completedSynchronously)   64

这发生在对特定WebResource.axd请求的请求上。

我们看到的另一个错误是:

  

对viewstate MAC的验证失败。   如果此应用程序由Web托管   农场或集群,确保    配置指定   相同的validationKey和验证   算法。无法使用AutoGenerate   在群集中。描述:An   未处理的异常发生在   当前网络的执行   请求。请查看堆栈跟踪   有关错误的更多信息   它起源于代码。

     

异常详细信息:   System.Web.HttpException:验证   视图状态MAC失败。如果这   应用程序由Web Farm托管或   集群,确保   配置指定相同   validationKey和验证   算法。无法使用AutoGenerate   在群集中。

发布表单时偶尔会发生此错误。

现在,在你跳入并告诉我这个错误的明显(通常)答案之前,请考虑一下:

  • 将应用程序部署到IIS6上的Windows Server 2003
  • 它不在Web场上。这里只使用一个网络服务器。
  • 应用程序池标识是一个自定义服务帐户,我确实在服务器上运行aspnet_regiss -ga <username>。没效果。

3 个答案:

答案 0 :(得分:24)

错误是因为您的应用域已被回收/重新启动。当发生这种情况时,应用程序和机器密钥设置为auto,它会发生变化。这会影响资源网址(.axd)网址中信息的解密。设置固定的机器密钥可以防止它再次发生。

请查看此信息以获取有关类似案例的更多信息(解释与viewstate验证存在问题,但原因相同):http://www.developmentnow.com/blog/InvalidViewstate+Or+Unable+To+Validate+Data+Error.aspx

我一直想知道它已经有一段时间了。在我看到这个问题之后,我再次得到了它:Is this an attempt to break my ASP.Net site's security? ...我刚刚回答的问题非常相似。我觉得它是围绕某些东西重新启动的,因为当我们发布了回收应用程序的东西时,错误显示在日志中,但我没有任何其他来源说明它的关系(今天我在invalidviewstate上找到了这个案例,因为机器密钥更改:))

聚苯乙烯。最后在单个服务器上解释了它:)

答案 1 :(得分:1)

在页面在浏览器中完全加载之前生成帖子时会出现此问题。看看this问题。

答案 2 :(得分:0)

钟,

对于你的第一个问题,我发现这似乎有点像你所看到的那个问题是零星发生的问题。 您应该可以在http://www.codeproject.com/KB/security/Cryptor.aspx#aes找到完整的解释。

您真正需要做的是将RijndaelAlg.Padding设置为PaddingMode.ISO10126,PaddingMode.PKCS7或PaddingMode.ANSIX923。只要在加密和解密时使用相同的值,这三个值中的任何一个都应该有效。其他值适用于某些数据,但不适用于所有数据。上述URL解释了原因。

我不明白的原因是Microsoft提供的选项有时不起作用,或者至少为什么它们不会默认为可靠的选项。