验证视图状态 MAC 失败的解决办法
?昨天用戶反應(yīng)系統(tǒng)中有問題,問題就在于翻頁(yè)的時(shí)候,系統(tǒng)會(huì)報(bào)以下錯(cuò)誤。但是我們的系統(tǒng)已經(jīng)上線1年多了,從來沒出現(xiàn)過錯(cuò)誤,怎么會(huì)出現(xiàn)錯(cuò)誤呢?
于是開始檢測(cè),查找原因。
1. 出錯(cuò)提示
“/”應(yīng)用程序中的服務(wù)器錯(cuò)誤。
驗(yàn)證視圖狀態(tài) MAC 失敗。如果此應(yīng)用程序由網(wǎng)絡(luò)場(chǎng)或群集承載,請(qǐng)確保 <machineKey> 配置指定了相同的 validationKey 和驗(yàn)證算法。不能在群集中使用 AutoGenerate。
說明: 執(zhí)行當(dāng)前 Web 請(qǐng)求期間,出現(xiàn)未處理的異常。請(qǐng)檢查堆棧跟蹤信息,以了解有關(guān)該錯(cuò)誤以及代碼中導(dǎo)致錯(cuò)誤的出處的詳細(xì)信息。
異常詳細(xì)信息: System.Web.HttpException: 驗(yàn)證視圖狀態(tài) MAC 失敗。如果此應(yīng)用程序由網(wǎng)絡(luò)場(chǎng)或群集承載,請(qǐng)確保 <machineKey>?
配置指定了相同的 validationKey 和驗(yàn)證算法。不能在群集中使用 AutoGenerate。
源錯(cuò)誤:
沒有行。
如圖
2.可能原因
?? 1) ASP.Net的 runat='server' 會(huì)對(duì)ViewStat進(jìn)行MAC的加密,使得提交數(shù)據(jù)時(shí)只能對(duì)同一頁(yè)面進(jìn)行。
?? 2) Cookie超時(shí)
?? 3) 錯(cuò)誤三的原因可能是代碼寫錯(cuò)了,即把數(shù)據(jù)不是提交給本頁(yè),而是提交給了其他頁(yè)面,如下:
?? <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 在接收頁(yè)加上(不添加ViewState,非安全方法)?
@ page EnableViewStateMac="false"
或者 enableEventValidation="false" viewStateEncryptionMode ="Never"
當(dāng)然也可以在web.config的節(jié)點(diǎn)里加入:
<system.web>
??? <pages enableEventValidation="false" viewStateEncryptionMode="Never" enableViewStateMac="false/>
</system.web>
====================================================================
enableViewState 可選的 Boolean 屬性, 默認(rèn)值為 True。
指定視圖狀態(tài)是否啟用并在多個(gè)頁(yè)請(qǐng)求之間保持。
enableViewStateMac 可選的 Boolean 屬性, 默認(rèn)值為 True。
指定從客戶端回發(fā)頁(yè)時(shí),ASP.NET 是否應(yīng)該對(duì)頁(yè)的視圖狀態(tài)運(yùn)行消息身份驗(yàn)證代碼 (MAC)。如果為 True,將檢查加密的視圖狀態(tài),以驗(yàn)證視圖狀態(tài)是否已在客戶端被篡改。
viewStateEncryptionMode 可選的 ViewStateEncryptionMode 屬性, 默認(rèn)值為 Auto。此屬性是 .NET Framework 2.0 中的新屬性。
Always 視圖狀態(tài)始終加密。
Never 視圖狀態(tài)從不加密,即使控件請(qǐng)求加密時(shí)也是如此。
Auto 視圖狀態(tài)根據(jù)控件的請(qǐng)求而加密。
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)" />
以上方法來源自網(wǎng)絡(luò),我使用了以上的方法,沒一個(gè)成功的,后來才發(fā)現(xiàn)原來我的代碼寫錯(cuò)。
4.錯(cuò)誤三執(zhí)行后的結(jié)果,如圖在瀏覽器中顯示為如下:
http://localhost:7124/Main.aspx?act=upload&path=%3C%=%20Server.UrlEncode(folderPath)%20%%3E
是由于"%3C%=%20Server.UrlEncode(folderPath)%20%%3E"這部分代碼造成的后果,只要把它修改為,實(shí)際值就可以了。
最后我把
?? <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">
執(zhí)行之后,系統(tǒng)顯示的錯(cuò)誤信息如下:
“/”應(yīng)用程序中的服務(wù)器錯(cuò)誤。
路徑中具有非法字符。
說明:?執(zhí)行當(dāng)前 Web 請(qǐng)求期間,出現(xiàn)未處理的異常。請(qǐng)檢查堆棧跟蹤信息,以了解有關(guān)該錯(cuò)誤以及代碼中導(dǎo)致錯(cuò)誤的出處的詳細(xì)信息。?異常詳細(xì)信息:?System.ArgumentException: 路徑中具有非法字符。
最終修改成了
?? <body>
?? <form id="uploadForm" method="post" runat=server action="upload.aspx?act=upload&path=" enctype="multipart/form-data">
<div id="container">
就解決了問題。把數(shù)據(jù)提交給了本頁(yè)面,而不是其他頁(yè)面。
所以很多時(shí)候,是由于自己寫代碼的時(shí)候不當(dāng)心造成的。
總結(jié)
以上是生活随笔為你收集整理的验证视图状态 MAC 失败的解决办法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#报错:创建调试信息文件 ……obj\
- 下一篇: 执行总裁与总经理区别(执行总裁)