2009-09-01 89 views
19

出版我的ASP.NET MVC Web应用程序的一个新的版本后,我经常会看到这样的例外在浏览网站的时候抛出:的ViewState MAC的ASP.NET MVC验证失败

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

在我访问我的Web应用程序的每个页面上,这个异常都会继续发生,直到我关闭Firefox。重新打开Firefox后,该网站完美运行。任何想法发生了什么?

其他注意事项:

  1. 我没有使用任何ASP.NET Web控件(也有在我的应用程序RUNAT = “服务器” 的任何实例)
  2. 如果我拿出<%= HTML .AntiForgeryToken%>从我的网页,这个问题似乎消失

回答

32

在封面下,MVC AntiForgeryToken属性使用machinekey进行加密。如果您没有在web.config中指定机器密钥(请参阅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" 
     /> 
    ... 
+0

即使输入machineKey,我仍然收到错误。难道是服务器上的machine.config(我没有访问到这个)配置不正确? – jesperlind 2009-11-12 01:54:40

+0

@jesperlind :(有点晚,但任何人阅读这可能会有所帮助...)你仍然得到的错误,因为你有一个来自添加机器密钥之前的cookie。如果您将机器钥匙从头开始锁定,它将无法顺利运行。 – Guffa 2011-10-21 07:53:08

+4

注意:请勿使用上述代码中的确切机器密钥。如果所有网站都有相同的机器密钥,则很容易规避。使用在线机密钥生成器生成唯一密钥,例如http://aspnetresources.com/tools/machineKey – Guffa 2011-10-21 08:21:10

1

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

0

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

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

http://aspnetresources.com/tools/machineKey

+1

链接已过时。 – Matty 2016-04-22 08:32:47