在发布我的ASP.NET MVC Web应用程序的新版本之后,我经常看到浏览网站时抛出这个异常:
System.Web.Mvc.HttpAntiForgeryException:未提供必需的防伪令牌或无效。 —> System.Web.HttpException:viewstate MAC的验证失败。如果此应用程序由Web场或群集托管,请确保配置指定相同的验证关键字和验证算法。 AutoGenerate不能在群集中使用。 —> System.Web.UI.ViewStateException:无效的viewstate。
在我关闭Firefox之前,我在Web应用程序中访问的每个页面上将继续发生这种异常。重新打开Firefox后,该网站工作完美。任何想法发生了什么?
补充笔记:
>我没有使用任何ASP.NET Web控件(在我的应用程序中没有runat =“server”的实例)
>如果我取出<%= Html.AntiForgeryToken%>从我的网页,这个问题似乎消失了
解决方法
在封面下,MVC AntiForgeryToken属性使用machinekey进行加密。如果您没有在web.config中指定一个machinekey(参见
here),ASP.NET(
full description)将为您自动生成一个。
如果ASP.NET应用程序重新启动(例如执行iisreset),则浏览器cookie中的AntiForgeryToken仍将使用旧的机器密钥进行加密,因此为什么它会以上述错误崩溃。
所以你应该总是在使用MVC时在web.config中指定一个machinekey。
<configuration> <system.web> <machineKey validationKey="21F090935F6E49C2C797F69BBAAD8402ABD2EE0B667A8B44EA7DD4374267A75D7AD972A119482D15A4127461DB1DC347C1A63AE5F1CCFAACFF1B72A7F0A281B" decryptionKey="ABAA84D7EC4BB56D75D217CECFFB9628809BDB8BF91CFCD64568A145BE59719F" validation="SHA1" decryption="AES" /> ...