验证视图状态 MAC 失败的解决办法
2023-02-18 15:36:11 时间
昨天用户反应系统中有问题,问题就在于翻页的时候,系统会报以下错误。但是我们的系统已经上线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&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&path=<%= Server.UrlEncode(folderPath) %>" enctype="multipart/form-data">
<div id="container">
先修改成
<body>
<form id="uploadForm" method="post" runat=server action="upload.aspx?act=upload&path=<%= Server.UrlEncode(folderPath) %>" enctype="multipart/form-data">
<div id="container">
执行之后,系统显示的错误信息如下:
“/”应用程序中的服务器错误。
异常详细信息: System.ArgumentException: 路径中具有非法字符。
最终修改成了
<body>
<form id="uploadForm" method="post" runat=server action="upload.aspx?act=upload&path=" enctype="multipart/form-data">
<div id="container">
就解决了问题。把数据提交给了本页面,而不是其他页面。
所以很多时候,是由于自己写代码的时候不当心造成的。
于是开始检测,查找原因。
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&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&path=<%= Server.UrlEncode(folderPath) %>" enctype="multipart/form-data">
<div id="container">
先修改成
<body>
<form id="uploadForm" method="post" runat=server action="upload.aspx?act=upload&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&path=" enctype="multipart/form-data">
<div id="container">
就解决了问题。把数据提交给了本页面,而不是其他页面。
所以很多时候,是由于自己写代码的时候不当心造成的。
相关文章
- 算法洗脑系列(8篇)——第八篇 概率思想
- 算法洗脑系列(8篇)——第七篇 动态规划
- 算法洗脑系列(8篇)——第六篇 回溯思想
- 算法洗脑系列(8篇)——第五篇 分治思想
- 12篇学通C#网络编程——第二篇 HTTP应用编程(上)
- 算法洗脑系列(8篇)——第四篇 枚举思想
- 算法洗脑系列(8篇)——第三篇 贪心思想
- chrome插件 - Redirect Path(揪出隐藏起来的小尾巴)
- 忙活了一年的开源社区,终于赶上了春节前的末班车!
- ChatGPT 会开源吗?
- 7 款殿堂级的开源 CMS(内容管理系统)
- 请收下这 10 个安全相关的开源项目
- MySQL 5.7 升级到 8.0
- 越折腾越好用的 3 款开源 APP
- 10 款更先进的开源命令行工具
- 对开源框架跃跃欲试,却在写的时候犯了难?
- 一大波开源小抄来袭
- 物联网?快来看 Arduino 上云啦
- 想做钢铁侠?听说很多大佬都是用它入门的
- 写给小白的开源编译器