验证视图状态 MAC 失败的解决办法

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介:

昨天用户反应系统中有问题,问题就在于翻页的时候,系统会报以下错误。但是我们的系统已经上线1年多了,从来没出现过错误,怎么会出现错误呢?
于是开始检测,查找原因。

1. 出错提示

“/”应用程序中的服务器错误。
验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 <machineKey> 配置指定了相同的 validationKey 和验证算法。不能在群集中使用 AutoGenerate。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.Web.HttpException: 验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 <machineKey> 
配置指定了相同的 validationKey 和验证算法。不能在群集中使用 AutoGenerate。

源错误:
没有行。
如图


2.可能原因

   1) ASP.Net的 runat='server' 会对ViewStat进行MAC的加密,使得提交数据时只能对同一页面进行。
   2) Cookie超时
   3) 错误三的原因可能是代码写错了,即把数据不是提交给本页,而是提交给了其他页面,如下:
   <body>
   <form id="uploadForm" method="post" runat=server action="Main.aspx?act=upload&amp;path=<%= Server.UrlEncode(folderPath) %>" enctype="multipart/form-data">
<div id="container">

3. 处理方法
1 在接收页加上(不添加ViewState,非安全方法) 
@ page EnableViewStateMac="false"
或者 enableEventValidation="false" viewStateEncryptionMode ="Never"
当然也可以在web.config的节点里加入:
<system.web>
    <pages enableEventValidation="false" viewStateEncryptionMode="Never" enableViewStateMac="false/>
</system.web>



====================================================================

enableViewState 可选的 Boolean 属性, 默认值为 True。
指定视图状态是否启用并在多个页请求之间保持。

enableViewStateMac 可选的 Boolean 属性, 默认值为 True。
指定从客户端回发页时,ASP.NET 是否应该对页的视图状态运行消息身份验证代码 (MAC)。如果为 True,将检查加密的视图状态,以验证视图状态是否已在客户端被篡改。

viewStateEncryptionMode 可选的 ViewStateEncryptionMode 属性, 默认值为 Auto。此属性是 .NET Framework 2.0 中的新属性。

Always 视图状态始终加密。
Never 视图状态从不加密,即使控件请求加密时也是如此。
Auto 视图状态根据控件的请求而加密。



2 配置matchineKey(安全的方法)
<system.web>
    <machineKey validation="3DES" validationKey="319B474B1D2B7A87C996B280450BB36506A95AEDF9B51211"
decryptionKey="280450BB36319B474C996B506A95AEDF9B51211B1D2B7A87" decryption="3DES"/>
</system.web>


3.
在<head></head>之间加入如下代码
<meta http-equiv="Page-Enter" content="RevealTrans(Duration=0,Transition=0)" />

以上方法来源自网络,我使用了以上的方法,没一个成功的,后来才发现原来我的代码写错。

4.错误三执行后的结果,如图在浏览器中显示为如下:
http://localhost:7124/Main.aspx?act=upload&path=%3C%=%20Server.UrlEncode(folderPath)%20%%3E

是由于"%3C%=%20Server.UrlEncode(folderPath)%20%%3E"这部分代码造成的后果,只要把它修改为,实际值就可以了。
最后我把
   <body>
   <form id="uploadForm" method="post" runat=server action="Main.aspx?act=upload&amp;path=<%= Server.UrlEncode(folderPath) %>" enctype="multipart/form-data">
<div id="container">
先修改成
   <body>
   <form id="uploadForm" method="post" runat=server action="upload.aspx?act=upload&amp;path=<%= Server.UrlEncode(folderPath) %>" enctype="multipart/form-data">
<div id="container">
执行之后,系统显示的错误信息如下:

“/”应用程序中的服务器错误。


路径中具有非法字符。

说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 

异常详细信息: System.ArgumentException: 路径中具有非法字符。


最终修改成了
   <body>
   <form id="uploadForm" method="post" runat=server action="upload.aspx?act=upload&amp;path=" enctype="multipart/form-data">
<div id="container">
就解决了问题。把数据提交给了本页面,而不是其他页面。
所以很多时候,是由于自己写代码的时候不当心造成的。

分类:  ASP.NET
本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/p/3979258.html ,如需转载请自行联系原作者
相关文章
|
iOS开发 MacOS Python
在Mac 上搭建Pygame开发环境(含安装错误的解决办法)
在Mac 上搭建Pygame开发环境(含安装错误的解决办法)
|
开发者
Mac 系统偏好设置 安全性与隐私 没有“任何来源” 选项解决办法
Mac 系统偏好设置 安全性与隐私 没有“任何来源” 选项解决办法
3895 0
|
Shell 开发工具 开发者
mac出现无法打开“*“,因为无法验证开发者 问题解决
mac出现无法打开“*“,因为无法验证开发者 问题解决
5027 0
mac出现无法打开“*“,因为无法验证开发者 问题解决
|
3月前
|
数据采集 中间件 关系型数据库
Mac系统通过brew安装mysql5.7后,启动报错的解决办法
Mac系统通过brew安装mysql5.7后,启动报错的解决办法
133 2
|
3月前
|
Web App开发 数据采集 安全
Mac系统安装chromedriver遇到的问题和解决办法
Mac系统安装chromedriver遇到的问题和解决办法
347 1
|
7月前
|
iOS开发 MacOS Python
Mac安装pip报错的解决办法
Mac安装pip报错的解决办法
|
7月前
|
Windows
Mac移动硬盘直接拔掉后,再插上无法显示的解决办法
Mac移动硬盘直接拔掉后,再插上无法显示的解决办法
|
开发工具 git
MAC编译OpenJDK8:clang: error: include path for libstdc++ headers not found(独家解决办法)
MAC编译OpenJDK8:clang: error: include path for libstdc++ headers not found(独家解决办法)
126 0
|
缓存 数据可视化 数据安全/隐私保护
Mac 系统占用100G+解决办法(详细步骤)
Mac 系统占用100G+解决办法(详细步骤)
1893 32
|
Windows
全网首发:WINDOWS主机与MAC虚拟机文件访问的解决办法
全网首发:WINDOWS主机与MAC虚拟机文件访问的解决办法
188 0
全网首发:WINDOWS主机与MAC虚拟机文件访问的解决办法