验证视图状态MAC失败问题正确的解决办法
今天做了個首頁登陸的頁面,是用Request.Form接收參數(shù)的
然后又做了個測試頁面test.aspx,代碼如下:
<body>
??? <form id="form1" runat="server" method="post" action="Default.aspx">
??? <div>
??????? <input type="text" runat="server" id="Solution" value="(Local)" />
??????? <input type="text" runat="server" id="UserName" value="ricky" />
??????? <input type="text" runat="server" id="Password" value="111" />
??????? <input type="submit" runat="server" />
??? </div>
??? </form>
</body>
但是測試的時候發(fā)現(xiàn)test頁面始終post到他自己
去掉runat標記則可以post到default.aspx,但去不到值
后來在IE里面查看源代碼,發(fā)現(xiàn)html是這個樣子的<form id="form1" method="post"?action="test.aspx">
也就是說生成的html里始終是post到自己的
知道問題就好辦了
修改代碼:
<form id="form1" runat="server" method="post"?οnsubmit="this.action='Default.aspx'">
一切OK,post到default.aspx了
然后又報錯了
驗證視圖狀態(tài) MAC 失敗。如果此應用程序由網(wǎng)絡場或群集承載,請確保 <machineKey> 配置指定了相同的 validationKey 和驗證算法。不能在群集中使用 AutoGenerate
去網(wǎng)上搜了搜,說問題的原因是asp.net的runat='server' 會對ViewStat進行MAC的加密,解決辦法基本上就2個:
1:修改當前頁面的@page屬性,添加enableEventValidation="false"?viewStateEncryptionMode="Never"
或者在web.config里添加<pages?enableEventValidation="false"?viewStateEncryptionMode="Never"?/>
2:在web.config里指定validationKey和驗證算法
<machineKey?validation="3DES"?validationKey="319B474B1D2B7A87C996B280450BB36506A95AEDF9B51211"?decryption="3DES" decryptionKey="280450BB36319B474C996B506A95AEDF9B51211B1D2B7A87" />
可是實際試下來發(fā)現(xiàn)沒用,問題依舊
查了查資料發(fā)現(xiàn)加上實際測試,終于發(fā)現(xiàn)了真正的解決辦法
修改當前頁面的@page屬性,添加enableEventValidation="false"?enableViewStateMac="false"
或者在web.config里添加<pages?enableEventValidation="false"?enableViewStateMac="false"?/>
原文地址:http://www.cnblogs.com/sephil/archive/2007/10/19/asp_net_post.html
(PS: 我發(fā)現(xiàn)如果是寫在頁面標記里,當前頁和POST的目的頁都需要寫)
如果你的Asp.Net程序執(zhí)行時碰到這種錯誤:“驗證視圖狀態(tài)?MAC?失敗。如果此應用程序由網(wǎng)絡場或群集承載,請確保?<machineKey>?配置指定了相同的?validationKey?和驗證算法。不能在群集中使用?AutoGenerate。”那么說明你沒有讓你的應用程序使用統(tǒng)一的machineKey,那么machineKey的作用是什么呢?按照MSDN的標準說法:“對密鑰進行配置,以便將其用于對 Forms 身份驗證 Cookie 數(shù)據(jù)和視圖狀態(tài)數(shù)據(jù)進行加密和解密,并將其用于對進程外會話狀態(tài)標識進行驗證。”也就是說Asp.Net的很多加密,都是依賴于machineKey里面的值,例如Forms 身份驗證 Cookie、ViewState的加密。默認情況下,Asp.Net的配置是自己動態(tài)生成,如果單臺服務器當然沒問題,但是如果多臺服務器負載均衡,machineKey還采用動態(tài)生成的方式,每臺服務器上的machinekey值不一致,就導致加密出來的結果也不一致,不能共享驗證和ViewState,所以對于多臺服務器負載均衡的情況,一定要在每臺站點配置相同的machineKey。
machineKey生成的算法:
validationKey = CreateKey(20);
decryptionKey = CreateKey(24);
???? protected string CreateKey(int len)
???? {
??????????? byte[] bytes = new byte[len];
??????????? new RNGCryptoServiceProvider().GetBytes(bytes);
????????????? StringBuilder sb = new StringBuilder();
????????????? for(int i = 0; i < bytes.Length; i++)
????????????? {???
?????????????????? sb.Append(string.Format("{0:X2}",bytes[i]));
????????????? }
????????????? return sb.ToString();
???? }
附參考的matchineKey配置:
<?xml version="1.0"?>
<configuration>
? <system.web>
??? <machineKey validationKey="3FF1E929BC0534950B0920A7B59FA698BD02DFE8" decryptionKey="280450BB36319B474C996B506A95AEDF9B51211B1D2B7A77" decryption="3DES" validation="SHA1"/>
???? </system.web>
</configuration>
轉(zhuǎn)載于:https://www.cnblogs.com/easypass/archive/2009/12/08/1619127.html
總結
以上是生活随笔為你收集整理的验证视图状态MAC失败问题正确的解决办法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Oxite移植到ASP.NET MVC2
- 下一篇: 如何读取FoxPro(dbf)打删除标记