验证视图状态MAC失败问题正确的解决办法
今天做了個(gè)首頁(yè)登陸的頁(yè)面,是用Request.Form接收參數(shù)的
然后又做了個(gè)測(cè)試頁(yè)面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>
但是測(cè)試的時(shí)候發(fā)現(xiàn)test頁(yè)面始終post到他自己
去掉runat標(biāo)記則可以post到default.aspx,但去不到值
后來(lái)在IE里面查看源代碼,發(fā)現(xiàn)html是這個(gè)樣子的<form id="form1" method="post"?action="test.aspx">
也就是說(shuō)生成的html里始終是post到自己的
知道問(wèn)題就好辦了
修改代碼:
<form id="form1" runat="server" method="post"?οnsubmit="this.action='Default.aspx'">
一切OK,post到default.aspx了
然后又報(bào)錯(cuò)了
驗(yàn)證視圖狀態(tài) MAC 失敗。如果此應(yīng)用程序由網(wǎng)絡(luò)場(chǎng)或群集承載,請(qǐng)確保 <machineKey> 配置指定了相同的 validationKey 和驗(yàn)證算法。不能在群集中使用 AutoGenerate
去網(wǎng)上搜了搜,說(shuō)問(wèn)題的原因是asp.net的runat='server' 會(huì)對(duì)ViewStat進(jìn)行MAC的加密,解決辦法基本上就2個(gè):
1:修改當(dāng)前頁(yè)面的@page屬性,添加enableEventValidation="false"?viewStateEncryptionMode="Never"
或者在web.config里添加<pages?enableEventValidation="false"?viewStateEncryptionMode="Never"?/>
2:在web.config里指定validationKey和驗(yàn)證算法
<machineKey?validation="3DES"?validationKey="319B474B1D2B7A87C996B280450BB36506A95AEDF9B51211"?decryption="3DES" decryptionKey="280450BB36319B474C996B506A95AEDF9B51211B1D2B7A87" />
可是實(shí)際試下來(lái)發(fā)現(xiàn)沒(méi)用,問(wèn)題依舊
查了查資料發(fā)現(xiàn)加上實(shí)際測(cè)試,終于發(fā)現(xiàn)了真正的解決辦法
修改當(dāng)前頁(yè)面的@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)如果是寫(xiě)在頁(yè)面標(biāo)記里,當(dāng)前頁(yè)和POST的目的頁(yè)都需要寫(xiě))
如果你的Asp.Net程序執(zhí)行時(shí)碰到這種錯(cuò)誤:“驗(yàn)證視圖狀態(tài)?MAC?失敗。如果此應(yīng)用程序由網(wǎng)絡(luò)場(chǎng)或群集承載,請(qǐng)確保?<machineKey>?配置指定了相同的?validationKey?和驗(yàn)證算法。不能在群集中使用?AutoGenerate。”那么說(shuō)明你沒(méi)有讓你的應(yīng)用程序使用統(tǒng)一的machineKey,那么machineKey的作用是什么呢?按照MSDN的標(biāo)準(zhǔn)說(shuō)法:“對(duì)密鑰進(jìn)行配置,以便將其用于對(duì) Forms 身份驗(yàn)證 Cookie 數(shù)據(jù)和視圖狀態(tài)數(shù)據(jù)進(jìn)行加密和解密,并將其用于對(duì)進(jìn)程外會(huì)話狀態(tài)標(biāo)識(shí)進(jìn)行驗(yàn)證。”也就是說(shuō)Asp.Net的很多加密,都是依賴(lài)于machineKey里面的值,例如Forms 身份驗(yàn)證 Cookie、ViewState的加密。默認(rèn)情況下,Asp.Net的配置是自己動(dòng)態(tài)生成,如果單臺(tái)服務(wù)器當(dāng)然沒(méi)問(wèn)題,但是如果多臺(tái)服務(wù)器負(fù)載均衡,machineKey還采用動(dòng)態(tài)生成的方式,每臺(tái)服務(wù)器上的machinekey值不一致,就導(dǎo)致加密出來(lái)的結(jié)果也不一致,不能共享驗(yàn)證和ViewState,所以對(duì)于多臺(tái)服務(wù)器負(fù)載均衡的情況,一定要在每臺(tái)站點(diǎn)配置相同的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
總結(jié)
以上是生活随笔為你收集整理的验证视图状态MAC失败问题正确的解决办法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Oxite移植到ASP.NET MVC2
- 下一篇: 如何读取FoxPro(dbf)打删除标记