当用户超过 30 分钟未返回 post 时,如何防止出现 "Validation of viewstate MAC failed" 错误?

How can I prevent "Validation of viewstate MAC failed" error when user does not post back for 30+ minutes?

视图状态验证 MAC 失败。如果此应用程序由网络场或集群托管,请确保配置指定相同的 validationKey 和验证算法。 AutoGenerate 不能在集群中使用。

我正在尝试找到一种方法来防止此错误。当用户将页面打开 30 多分钟并触发回发事件时,它就会在我的网站上发生。我理解此错误的方式和我的问题是应用程序池已回收并且视图状态不再有效。我不确定如何在不保持会话活动和浪费资源的情况下解决这个问题...完成此任务的任何巧妙方法?

根据 this 页面,您可能会收到此错误的原因有 4 个:

  1. 应用程序运行在场(多服务器环境)中
  2. 工作进程使用 IIS 7.0* 应用程序池标识
  3. 使用LoadUserProfile = false
  4. 配置的应用程序池
  5. Page.ViewStateUserKey 属性 的值不正确

* 注意:根据文章,这不再是从 IIS 7.5 及更高版本开始的问题。

大局

问题的大局是用于加密视图状态数据的加密密钥没有被持久化(出于上述原因之一或这些原因的组合),因此正在生成不匹配的新加密密钥原来的。有几种方法可以保留此密钥(或让您的应用程序使用正确的密钥)。请参阅下面的解决方案。

解决方案

  1. 在 web.config
  2. 中手动设置 MachineKey
  3. 将 aspnet_regiis 实用程序用于 运行 托管应用程序,其中将保留机器密钥。
  4. 运行 PowerShell 脚本将机器密钥保存在 HKLM 注册表而不是 HKCU 注册表中。
  5. 设置 LoadUserProfile = true 使 HKCU 注册表配置单元可供应用程序使用。
  6. 检查 Page.ViewStateUserKey 属性 的正确性以查看使用的值是否与生成密钥时的值匹配(即如果您使用此 属性)。

这是一个快速概览。有关问题的任何原因(以及 #3 中的 PowerShell 脚本)或该问题的解决方案的更多详细信息,请查看文章以解决您的特定情况并找到 select 最适合您目的的解决方案。