Viewstate异常验证viewstate MAC失败

时间:2013-10-14 07:18:54

标签: asp.net sitecore

在我们的日志文件中,我发现以下异常。 (ASP.NET,Sitecore 6.6)。任何想法为什么会这样?

我提到this post。我的应用程序不在服务器场中。每次回发都不会发生这种情况。

7776 02:11:53 ERROR Application error. 
Exception: System.Web.HttpException 
Message: Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that <machineKey> configuration specifies the same validationKey and validation algorithm. AutoGenerate cannot be used in a cluster. 
Source: System.Web 
at System.Web.UI.ViewStateException.ThrowError(Exception inner, String persistedState, String errorPageMessage, Boolean macValidationError) 
at System.Web.UI.ObjectStateFormatter.Deserialize(String inputString, Purpose purpose) 
at System.Web.UI.Util.DeserializeWithAssert(IStateFormatter2 formatter, String serializedState, Purpose purpose) 
at System.Web.UI.HiddenFieldPageStatePersister.Load() 
at System.Web.UI.Page.LoadPageStateFromPersistenceMedium() 
at System.Web.UI.Page.LoadAllState() 
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 
at System.Web.UI.Page.ProcessRequest() 
at System.Web.UI.Page.ProcessRequest(HttpContext context) 
at System.Web.UI.Page.ProcessRequest(HttpContext context) 
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

Nested Exception 

Exception: System.Web.UI.ViewStateException 
Message: Invalid viewstate. 
Client IP: xxx.xxx.xxx.201 
Port: <PORT> 
Referer: <URL> 
Path: /<PAGE>
User-Agent: Mozilla/5.0 (Windows NT 6.2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11 
ViewState: /wEPDwUJMzY0OTY5Mjg5D2QWAgIFEGRkFgQCAw9kFgJmD2QWAmYPZBYCAg4PZBYCZg9kFgQCAw8PFgQeFUN1cnJlbnRTZWxlY3Rpb25WYWx1ZQUkMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwHhRDdXJyZW50U2VsZWN0aW9uVGV4dAUVQWxsIENhdGVnb3JpZXMgKDY5NTEpZBYCAgEPZBYCZg9kFgICAQ8UKwACDxYGHgRUZXh0BRVBbGwgQ2F0ZWdvcmllcyAoNjk1MSkeBF8hU0ICAh4IQ3NzQ2xhc3MFB1Rvb2xCYXJkEBYBZhYBFCsAAmRkDxYBZhYBBXdUZWxlcmlrLldlYi5VSS5SYWRDb21ib0JveEl0ZW0sIFRlbGVyaWsuV2ViLlVJLCBWZXJzaW9uPTIwMTIuMi42MDcuMzUsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49MTIxZmFlNzgxNjViYTNkNBYCAgIPFCsAAWQWAgIBDxQrAAIUKwACFCsAAg8WBB8EBQdUb29sQmFyHwMCAmQPFCsAARQrAAIPFgYfAgUVQWxsIENhdGVnb3JpZXMgKDY5NTEpHgVWYWx1ZQUkMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwHghTZWxlY3RlZGdkZA8UKwEBZhYBBXNUZWxlcmlrLldlYi5VSS5S...

2 个答案:

答案 0 :(得分:4)

请查看此link

根本原因 出现此异常是因为使用DataKeyNames的控件需要加密Viewstate。当Viewstate被加密时(默认模式,自动,如果控件需要加密,否则不加密),页面在关闭标签之前添加字段。但是这个隐藏字段可能没有被渲染到具有长时间运行页面的浏览器,并且如果你在它之前进行回发,浏览器会启动回发而不使用此字段(在表单集合中)。最终结果是,如果在回发时省略此字段,则页面不知道Viewstate已加密并导致上述异常。 I.E.页面预计会在您回发之前完全加载。

顺便说一下,类似的问题是事件验证,因为__EVENTVALIDATION字段也会在表单的末尾呈现。这是一项安全功能,可确保回发操作仅来自服务器允许和创建的事件,以帮助防止欺骗性回发。此功能通过让控件在呈现时注册有效事件(如在实际的Render()方法中)来实现。最终的结果是,在渲染标签的底部,您会看到如下内容:。发生回发时,ASP.NET使用存储在此隐藏字段中的值来确保您单击的按钮调用有效事件。如果它无效,则会出现上述异常。

特别是在呈现EventValidation字段之前回发时会出现问题。如果启用了EventValidation(默认情况下是这样),但是当您回发时ASP.net没有看到隐藏字段,您也会得到异常。如果您在完全呈现之前提交表单,则可能尚未呈现EventValidation字段,因此ASP.NET无法验证您的点击。

解决方法 1.将enableEventValidation设置为false,将viewStateEncryptionMode设置为Never,如下所示:

这具有禁用验证和加密的不良副作用。在某些网站上,这可能没问题,但这不是最佳做法,尤其是在面向公众的网站上。

答案 1 :(得分:0)

我在最近的项目中遇到了类似的问题。当我试图从谷歌找到一些帮助时,大多数人讨论的内容如下:

在web.config中添加计算机密钥

<system.web> <machineKey validationKey="..." decryptionKey="..." validation="SHA1" /> </system.web>

在web.config中设置EnableViewStateMAC = False

<system.web> <pages enableViewStateMac="False"/> </system.web>

但以上所有解决方案对我都不起作用。每当我尝试使用IP地址打开应用程序时它工作正常但如果我尝试使用域名打开应用程序,它会显示我&#34; Viewstate MAC失败&#34;错误。我深入了解问题是什么,最终我找到了解决方案,当浏览器不接受来自服务器的cookie时会发生此错误。

Godaddy为屏蔽提供域转发功能。我的一位同事在我们的应用程序域中设置了该功能,IE和Safari具有安全级别,他们不接受来自第三方和广告商的cookie,因此这两个浏览器生成了&#34; Viewstate MAC失败&#34;错误。

您可以将安全级别设置为接受IE中的所有Cookie 工具&gt;互联网选项&gt;隐私 和移动设置滑块底部的值&#34;接受所有Cookie&#34;。

希望这个解决方案能帮助其他人摆脱asp.net遗留错误&#34; Viewstate MAC失败&#34;。