博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
验证视图状态 MAC 失败的解决办法
阅读量:5063 次
发布时间:2019-06-12

本文共 2805 字,大约阅读时间需要 9 分钟。

昨天用户反应系统中有问题,问题就在于翻页的时候,系统会报以下错误。但是我们的系统已经上线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">

就解决了问题。把数据提交给了本页面,而不是其他页面。

所以很多时候,是由于自己写代码的时候不当心造成的。

转载于:https://www.cnblogs.com/aiwz/p/6153900.html

你可能感兴趣的文章
Git学习资料
查看>>
phpstudy 无法启动,提示unable write to xxxxxphpstudy.ini
查看>>
javascript 的继承
查看>>
NServiceBus-安装
查看>>
(转)Loader ,URLLoader ,URLStream的区别
查看>>
[转]前端版本控制工具 gulp或者Grunt插件 基于nodejs
查看>>
Educational Codeforces Round 23 F. MEX Queries 离散化+线段树
查看>>
第04次作业-树
查看>>
2. Postman发送各种格式请求的方法
查看>>
Spring mvc annotation and xml example
查看>>
关于报错The specified child already has a parent的解决办法
查看>>
16 this和构造代码块
查看>>
LIN总线学习-总线逻辑
查看>>
Uva(10305)
查看>>
调整数组顺序使奇数位于偶数前面
查看>>
React Native知识3-TextInput组件
查看>>
MDK 添加芯片支持 以STM32F103ZE为例
查看>>
搭建 flask 应用
查看>>
C++ 约瑟夫环问题
查看>>
制作iOS应用图标的最简单方法
查看>>