Validation of viewstate MAC failed 解决办法

大部分人都说是在页里或web.config里加EnableEventValidation="false" EnableViewStateMac="false" ViewStateEncryptionMode="Never" 这些属性的设置。但是这并不从根本上解决问题,相反这样做了反而更加不安全。

为了解决问题我继续收集资料,不经意的发现了一个网页里讲到一个Blog系统从NET1.1升级到NET2后,之前所生成的所有cookies将会失效,因为NET2和NET1使用的machineKey不一样。哈哈,真是恍然大悟啊!

 WEB应用中经常遇到采用集群或负载均衡交换机等方式实现多服务器共同对外提供服务,分担压力。在这样的环境下,如果Asp.Net程序执行时碰到如下中文错误:

“验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 <machineKey> 配置指定了相同的validationKey 和验证算法。不能在群集中使用 AutoGenerate。”

或如下英文错误:

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.

则说明多台WEB服务器上的WEB应用程序没有使用统一的machineKey导致的。

       那么machineKey的作用是什么呢?

按照MSDN的标准说法:“对密钥进行配置,以便将其用于对 Forms 身份验证 Cookie 数据和视图状态数据进行加密和解密,并将其用于对进程外会话状态标识进行验证。”

也就是说Asp.Net的很多加密,都是依赖于machineKey的设置,例如Forms 身份验证 Cookie、ViewState的加密。默认情况下,Asp.Net的配置是自己动态生成,validationKey和decryptionKey的默认值是AutoGenerate。如果单台服务器当然没问题,但是如果多台服务器负载均衡,machineKey还采用动态生成的方式,每台服务器上的machinekey值不一致,就导致加密出来的结果也不一致,不能共享验证和ViewState,所以对于多台服务器负载均衡的情况,一定要在每台站点配置相同的machineKey。

至此真相水落石出,立刻在web.config中添加关于machineKey的配置项,并手动设置其中的密钥值,这里请注意,不同加密算法对于密钥的最大字符长度是不同的,在这里能够使用的有AES,DES,3DES,SHA1,MD5,我只知道DES的密钥字符长度为16,3DES长度为48,手动设置时密钥长度必须等于其最大长度,否则会出错!至于密钥的16进制值可以随便输入。

参考的web.config 中matchineKey配置:

<system.web>               <machineKey validation="3DES" validationKey="319B474B1D2B7A87C996B280450BB36506A95AEDF9B51211"

         decryptionKey="280450BB36319B474C996B506A95AEDF9B51211B1D2B7A87" decryption="3DES"/>       </system.web>

       好了,问题得已解决!希望广大朋友遇到MAC验证视图状态失败的问题的时候,不要马上把EnableViewStateMac="false"设置成这样就完事了。先分析什么原因导致了这个错误的发生,禁用掉EnableViewStateMac验证是可以解决问题,但这不是根本的,起码是牺牲了一定的安全性!

注意:实际使用时报错

此时按照提示将validation换成SHA1就OK了

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏python成长之路

用户注册登录系统 V2.0

34130
来自专栏小樱的经验随笔

利用 John the Ripper 破解用户登录密码

看到这个标题,想必大家都很好奇,John the Ripper 是个什么东西呢?如果直译其名字的话就是: John 的撕裂者(工具)。 相比大家都会觉得摸不着头...

34120
来自专栏Kubernetes

原 荐 从一次集群雪崩看Kubelet资源预

Author: xidianwangtao@gmail.com Kubelet Node Allocatable Kubelet Node Allocat...

727100
来自专栏精讲JAVA

Java 配合 mitmproxy HTTPS 抓包调试

今天对接接口,对方给的 Demo 和已有项目用的 HTTP 工具不是一个;后来出现人家的好使,我的死活不通的情况;无奈之下开始研究 Java 抓包,所以怕忘了记...

37520
来自专栏张善友的专栏

ASP.NET 2.0加密Web.config 配置文件

可以使用受保护配置来加密 Web 应用程序配置文件(如 Web.config 文件)中的敏感信息(包括用户名和密码、数据库连接字符串和加密密钥)。对配置信息进行...

24960
来自专栏小程序解决方案的专栏

自己部署 PHP 版本的 Wafer2 Demo

自行部署适用于想将腾讯云 Wafer SDK 和 Demo 部署在自己的服务器上以获得更高的灵活性和操纵权限的用户。部署过程需要从零开始搭建线上环境,需要有一定...

6.7K50
来自专栏Python中文社区

使用python实现后台系统的JWT认证

專 欄 ❈ 茶客furu声,Python中文社区专栏作者 博客: http://www.jianshu.com/p/537b356d34c9 ❈ ...

90150
来自专栏about云

大数据,云技术基础知识:ssh解惑,到底谁免登陆谁

问题导读 1.对于两台拥有公钥和私钥的密钥对,拥有私钥的客户端是否可以免密码登录公钥的客户端? 2.如果多台机器配置相互免登陆,该如何操作最简单? ss...

28950
来自专栏禁心尽力

详谈Struts2

介绍struts2:   struts2是一个基于mvc设计模式的web层框架。 ? 详谈struts2的执行流程: ? struts2的执行流程:用户发送请求...

21950
来自专栏发卡君

发卡君Python3接口

37800

扫码关注云+社区

领取腾讯云代金券