ASP.NET 中的加密内容不会解密,或者对于使用持久性表单身份验证 cookie 或部署在 Web 场中的网站来说会导致错误

将安全更新 MS10-070 应用于为部署在 Web 场中的Microsoft ASP.NET 网站提供服务的服务器后,Web 场中的某些服务器或应用程序可能会遇到以下一种或多种症状:

  • 无法解密数据
  • WebResource 或 ScriptResource 处理程序中的异常
  • 使用表单身份验证时身份验证失败
  • “视图状态无效”异常
  • 尝试解密表单身份验证 cookie 等数据时出现“无法验证数据”异常

访问 ASP.NET 应用程序时,故障可能表现为应用程序异常,并且类似于以下的信息也可能记录在应用程序日志中。 

消息 1:

System.Web.HttpException:无法验证数据。 在 System.Web.Configuration.MachineKeySection.EncryptOrDecryptData (布尔值 fEncrypt、Byte[] buf、Byte[] 修饰符、Int32 start、Int32 length、IVType ivType、Boolean useValidationSymAlgo、Boolean signData)
消息 2:

事件类型:警告
事件源:ASP.NET 2.0.50727.0
事件类别:Web 事件
事件 ID:1309
Date: Date
时间: 时间
用户: 不适用
说明:
事件代码:3005
事件消息:发生未处理的异常。
异常信息:
    异常类型: HttpException
    异常消息:无法验证数据。

症状

公告 MS10-070 解决的安全更新更改了 ASP.NET 中加密的默认行为。 安装安全更新后新的默认行为是,即使仅请求加密,除了加密之外,还执行验证。 此默认行为会更改应用此更新的服务器上的加密有效负载。 有效负载可能包括视图状态和窗体身份验证 Cookie。 如果 Web 场只有应用了安全更新的某些服务器,则 Web 场中不同服务器之间同一有效负载上的加密和解密方法将存在差异,并且这种行为差异将导致异常。 如果在应用安全更新后使用了在应用安全更新之前保留在系统上的表单身份验证 cookie,则也会发生此行为。

此外,对于 Microsoft .NET Framework 2.0 的不同 Service Pack 版本,加密和解密方法也不同。 因此,在安装了安全更新的 Web 场环境中,为 .NET Framework 设置不同的 Service Pack 级别将导致不同的加密有效负载和类似的解密失败。

原因

验证在提供 ASP.NET 内容的所有服务器上满足以下条件:

  • 在 Web 场中为 ASP.NET 网站提供服务的所有服务器都必须安装安全更新。 如果某些服务器未安装安全更新,则必须将更新应用于这些服务器。
  • 如果将 MS10-070 安全更新应用于所有系统,则在 Web 场中运行某种版本的 .NET Framework 2.0 的所有计算机必须处于同一 Service Pack 级别。 如果服务器上的 Service Pack 级别存在差异,则必须将所有服务器更新为最新的 Service Pack,并重新应用所有安全更新。 因此,如果 Web 场中的某些服务器运行的是 .NET Framework 2.0 SP1,而其他服务器运行的是 .NET Framework 2.0 SP2,则必须先将所有 .NET Framework 2.0 SP1 服务器升级到 ..NET Framework 2.0 SP2,然后才能将安全更新应用于 Web 场中的所有服务器。
  • 确保应用程序不使用加密数据,例如在应用更新之前生成的表单身份验证 Cookie。 应用安全更新后,必须刷新以前加密的数据。

有关如何检测 .NET Framework 版本以及在服务器上安装安全更新的更多信息,请参阅“参考”部分。

解决方法

有关 ASP.NET 视图状态的详细信息,请参阅以下文章:

ASP.NET 视图状态概述 有关 ASP.NET Forms 身份验证的详细信息,请参阅以下文章:

ASP.NET Forms 身份验证概述 有关 ASP.NET Forms 身份验证票证和 Cookie 的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

910443 了解表单身份验证票证和 Cookie 有关 ASP.NET Web 资源处理程序的更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

910442 在 ASP.NET 2.0 中使用 Web 资源

参考资料