【问题标题】:How can I prevent "Validation of viewstate MAC failed" error when user does not post back for 30+ minutes?当用户超过 30 分钟未回发时,如何防止“视图状态 MAC 验证失败”错误?
【发布时间】:2017-06-14 15:40:50
【问题描述】:

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

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

【问题讨论】:

  • 在该页面上完全禁用 ViewState。很可能你在那个页面上并不真的需要它。

标签: asp.net vb.net viewstate


【解决方案1】:

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

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

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

大局

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

解决方案

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 2011-12-18
    相关资源
    最近更新 更多