【问题标题】:ASP.NET MVC Validation of ViewState MAC failedViewState MAC 的 ASP.NET MVC 验证失败
【发布时间】:2010-11-24 12:13:26
【问题描述】:

在发布我的 ASP.NET MVC Web 应用程序的新版本后,我经常看到在浏览网站时抛出此异常:

System.Web.Mvc.HttpAntiForgeryException:所需的防伪令牌未提供或无效。 ---> System.Web.HttpException:视图状态 MAC 验证失败。如果此应用程序由 Web Farm 或集群托管,请确保配置指定相同的 validationKey 和验证算法。 AutoGenerate 不能在集群中使用。 ---> System.Web.UI.ViewStateException: 无效的视图状态。

在我关闭 Firefox 之前,我在 Web 应用程序中访问的每个页面都会继续出现此异常。重新打开 Firefox 后,该站点运行良好。知道发生了什么吗?

补充说明:

  1. 我没有使用任何 ASP.NET Web 控件(我的应用程序中没有 runat="server" 的实例)
  2. 如果我从我的页面中取出 ,这个问题似乎就消失了

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    在幕后,MVC AntiForgeryToken 属性使用机器密钥进行加密。如果您未在 web.config 中指定机器密钥(请参阅here),ASP.NET 会自动为您生成一个(full description)。

    如果重新启动 ASP.NET 应用程序(例如,执行 iisreset),浏览器 cookie 中的 AntiForgeryToken 仍将使用旧机器密钥加密,因此它会因上述错误而崩溃。

    因此,在使用 MVC 时,您应该始终在 web.config 中指定机器密钥,例如

    <configuration>
        <system.web>
            <machineKey  
                validationKey="21F090935F6E49C2C797F69BBAAD8402ABD2EE0B667A8B44EA7DD4374267A75D7AD972A119482D15A4127461DB1DC347C1A63AE5F1CCFAACFF1B72A7F0A281B"           
                decryptionKey="ABAA84D7EC4BB56D75D217CECFFB9628809BDB8BF91CFCD64568A145BE59719F"
                validation="SHA1"
                decryption="AES"
            />
        ...
    

    【讨论】:

    • 即使我这样输入 machineKey,我仍然会收到错误消息。会不会是服务器上的machine.config(我没权限)配置不正确?
    • @jesperlind:(有点晚了,但任何阅读此内容的人都可能会有所帮助......)您仍然会收到错误消息,因为您在添加机器密钥之前有一个 cookie。只有从一开始就锁定机器钥匙,它才能顺利工作。
    • 注意:不要使用上面代码中的确切机器密钥。如果所有站点都具有相同的机器密钥,则很容易绕过。使用在线机器密钥生成器生成唯一密钥,例如aspnetresources.com/tools/machineKey
    • 谢谢@Guffa。所以这意味着如果我们出于某种原因需要更改机器密钥,我们就会被熏死。我们必须要求用户删除他们的 cookie 才能再次使用该网站。根据我的经验,AntiForgeryToken 在 Mvc2 及以下版本中存在一些问题。我最终编写了一个捕获 HttpAntiForgeryException 的过滤器,然后: filterContext.HttpContext.Request.Cookies.Remove("RequestVerificationToken_Lw");只是现在我已经升级到 Mvc3,我删除了那个过滤器,从那以后我没有任何问题。
    • @jesperlind:它是一个会话 cookie,因此只有在更新前后打开浏览器并访问该站点的用户才有问题。
    【解决方案2】:

    如果您在服务器场中,请确保每台服务器上的机器密钥都相同。

    【讨论】:

      【解决方案3】:

      我也有这个问题,期望用户清除缓存、cookie 或刷新页面是不可接受的。

      将机器密钥添加到 web.config 将解决此问题。我使用此工具快速生成密钥,因此在开发过程中看不到这些错误,然后在网站投入生产时正确生成密钥。

      http://aspnetresources.com/tools/machineKey

      【讨论】:

        猜你喜欢
        • 2010-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多