• Validation of viewstate MAC failed异常的原因及解决方法


                       Validation of viewstate MAC failed异常的原因及解决方法

    对于内容较多,功能较为复杂的页面,如本站的课程详细信息页面,偶尔会出现Validation of viewstate MAC failed的错误。
    在异常的信息里,会说是在web farm或者集群环境下,machineKey的配置不一致导致的。而事实上,我们还并没有使用web场和集群,因此异常的提示信息显然是一种误导了。

    事件日志里偶尔能发现这个错误,却一直找不到有效的解决方法。经过仔细研究分析之后,发现出现这个错误的概率还是很小的,还需要满足多个条件才行:
    1.页面中使用了GridView, DetailsViews, FormView等采用内置数据绑定控件
    2.就是这个页面的内容较多,在网速较慢的情况下需要较长的时间才能加载完
    3.在页面还没有加载完成的情况下,点击了Postback性质的按钮。如果是get方式的url链接请求则不存在此问题

    内在的深层次原因,是由于GridView等控件,为了避免暴露数据库中的字段名称,在默认的asp.net 2.0设置之下,会对GridView里用到的DataKeyNames使用加密方式存储在ViewState里,并在页尾</form>标签标签之前写入一个隐藏域<input type="hidden" name="__VIEWSTATEENCRYPTED" id="__VIEWSTATEENCRYPTED" value="" />用来表明ViewState是使用加密存储的。
    由于这个隐藏域在页尾,因此在前面所述为页面尚未完全加载的情况下就点击Post方式的按钮,就会导致在服务器端处理反序列化viewstate时,因为找不到这个隐藏域而认为是非法的ViewState,而抛出这个异常。

    解决方法就是禁止ViewState的加密,不利之处是会降低网站的安全性。
    如果要禁用整个站点或者模块的ViewState加密,只需在web.config里作如下设置即可:
    lt;pages enableEventValidation="false" viewStateEncryptionMode ="Never" />
    当然也可以只对有出现这个问题页面的<@page作enableEventValidation="false" viewStateEncryptionMode ="Never" 设置,这样的话只会在这个页面的ViewState不作加密,不会影响到整个站点所有页面的安全性。

    微软已经确认这是一个Bug,详细地讨论也可以参考asp.net官方站点 http://forums.asp.net/1/1173230/ShowThread.aspx

  • 相关阅读:
    BZOJ 2818: Gcd
    BZOJ 4816: [Sdoi2017]数字表格
    BZOJ 2301: [HAOI2011]Problem b
    BZOJ 2440: [中山市选2011]完全平方数
    BZOJ 2705: [SDOI2012]Longge的问题
    BZOJ 3992: [SDOI2015]序列统计
    BZOJ 3529: [Sdoi2014]数表
    AC日记——小A的糖果 洛谷七月月赛
    AC日记——「HNOI2017」礼物 LiBreOJ 2020
    AC日记——[Hnoi2017]影魔 bzoj 4826
  • 原文地址:https://www.cnblogs.com/Mr_JinRui/p/2153545.html
Copyright © 2020-2023  润新知