Asp.net mvc ViewState MAC的ASP.NET MVC验证失败

Asp.net mvc ViewState MAC的ASP.NET MVC验证失败,asp.net-mvc,Asp.net Mvc,发布ASP.NET MVC web应用程序的新版本后,我经常在浏览网站时看到引发此异常: System.Web.Mvc.HttpAntiForgeryException:未提供所需的防伪令牌或该令牌无效。-->System.Web.HttpException:viewstate MAC验证失败。如果此应用程序由Web场或群集托管,请确保配置指定了相同的validationKey和验证算法。无法在群集中使用自动生成。-->System.Web.UI.viewstate异常:无效的viewstate

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

System.Web.Mvc.HttpAntiForgeryException:未提供所需的防伪令牌或该令牌无效。-->System.Web.HttpException:viewstate MAC验证失败。如果此应用程序由Web场或群集托管,请确保配置指定了相同的validationKey和验证算法。无法在群集中使用自动生成。-->System.Web.UI.viewstate异常:无效的viewstate

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

补充说明:

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

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

    在封面下,MVC AntiForgeryToken属性使用machinekey进行加密。如果未在web.config(请参阅)中指定machinekey,则ASP.NET()会自动为您生成一个machinekey

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

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

    <configuration>
        <system.web>
            <machineKey  
                validationKey="21F090935F6E49C2C797F69BBAAD8402ABD2EE0B667A8B44EA7DD4374267A75D7AD972A119482D15A4127461DB1DC347C1A63AE5F1CCFAACFF1B72A7F0A281B"           
                decryptionKey="ABAA84D7EC4BB56D75D217CECFFB9628809BDB8BF91CFCD64568A145BE59719F"
                validation="SHA1"
                decryption="AES"
            />
        ...
    
    
    ...
    
    我也有这个问题,希望用户清除缓存、cookie或刷新页面是不可接受的

    将machinekey添加到web.config将解决此问题。我使用这个工具快速生成一个密钥,这样我在开发中就不会看到这些错误,然后在站点投入生产时正确地生成一个密钥


    即使我像这样进入机器钥匙,仍然会出现错误。可能是服务器上的machine.config(我没有访问权限)配置不正确吗?@jesperlind:(有点晚了,但任何阅读此文件的人都可能会得到帮助…)您仍然会收到错误,因为在添加机器密钥之前,您有一个cookie。如果您从一开始就将机器钥匙锁定,则它只能在没有挂接的情况下工作。注意:不要使用上述代码中的确切机器钥匙。如果所有站点都有相同的机器密钥,那么很容易规避。使用联机machinekey生成器生成唯一密钥,例如Thank@Guffa。这意味着如果我们因为某种原因需要更换机器钥匙,我们就会被烟熏。我们必须要求用户删除他们的cookie才能再次使用该网站。根据我的经验,在Mvc2及以下版本中,AntiForgeryToken有点问题。最后,我编写了一个过滤器,捕获了HttpAntiforyException,然后:filterContext.HttpContext.Request.Cookies.Remove(“RequestVerificationToken_Lw”);直到现在我已经升级到Mvc3,我才删除了这个过滤器,从那以后我就没有任何问题了。@jesperlind:这是一个会话cookie,所以这只是在更新前后打开浏览器并访问站点的用户的问题。