ASP.NET MVC验证ViewState MAC失败

Kev*_*ang 19 asp.net-mvc

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

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

在我的Web应用程序中访问的每个页面上都会继续发生此异常,直到我关闭Firefox.重新打开Firefox后,该网站运行良好.知道发生了什么事吗?

补充说明:

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

Dun*_*unc 32

在幕后,MVC AntiForgeryToken属性使用machinekey进行加密.如果未在web.config中指定machinekey(请参见此处),则ASP.NET会自动为您生成一个(完整描述).

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

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

<configuration>
    <system.web>
        <machineKey  
            validationKey="21F090935F6E49C2C797F69BBAAD8402ABD2EE0B667A8B44EA7DD4374267A75D7AD972A119482D15A4127461DB1DC347C1A63AE5F1CCFAACFF1B72A7F0A281B"           
            decryptionKey="ABAA84D7EC4BB56D75D217CECFFB9628809BDB8BF91CFCD64568A145BE59719F"
            validation="SHA1"
            decryption="AES"
        />
    ...
Run Code Online (Sandbox Code Playgroud)

  • 注意:请勿使用上述代码中的确切机器密钥.如果所有站点都具有相同的机器密钥,则很容易规避.使用在线机器密钥生成器生成唯一密钥,例如http://aspnetresources.com/tools/machineKey (4认同)