天天看點

驗證視圖狀态 MAC 失敗。如果此應用程式由網絡場或群集承載,請確定<machineKey>

驗證視圖狀态 MAC 失敗。如果此應用程式由網絡場或群集承載,請確定<machineKey>

驗證視圖狀态 MAC 失敗。如果此應用程式由網絡場或群集承載,請確定 <machineKey> 配置指定了相同的 validationKey 和驗證算法。不能在群集中使用 AutoGenerate。

說明: 執行目前 Web 請求期間,出現未處理的異常。請檢查堆棧跟蹤資訊,以了解有關該錯誤以及代碼中導緻錯誤的出處的詳細資訊。

異常詳細資訊: System.Web.HttpException: 驗證視圖狀态 MAC 失敗。如果此應用程式由網絡場或群集承載,請確定 <machineKey> 配置指定了相同的 validationKey 和驗證算法。不能在群集中使用 AutoGenerate。

分析:

分析後找到了問題的根源。首先,文章中提到,如果用GridView,并且指定了DataKeyNames屬性,則出于安全的理由(因為DataKeyNames指定的字段代表資料的主鍵,且該主鍵值需要儲存在視圖狀态中發送到用戶端,使用者如果篡改主鍵值,會導緻安全問題),GridView會要求加密視圖狀态。為此會自動在頁面表單</forms>之前添加一個

然而,Atlas的UpdatePanel要求放置在<form></form>内部,也就是</form>之前。這就意味着添加的隐藏input控件沒有被放置在UpdatePanel内,而是放置在UpdatePanel和</form>之間。

當UpdatePanel更新時,UpdatePanel内部的控件被送出到伺服器進行處理(Patrial Rendering),而整個頁面并沒有被送出。也就是說隐藏的input控件沒有随着一起送出。是以伺服器并不知道送出的ViewState被加密了,進而導緻MAC驗證錯誤。

解決方法有二,僅供參考:

1.可以在目前頁面的<page ...>裡加兩個屬性:

enableEventValidation="false" viewStateEncryptionMode ="Never"

2.當然還可以在web.config裡加入:(<system.web>之間)

其餘方法   

在web.config中的pages節點上添加enableviewstatemac=false 

附帶:

          一般而言是因為你的某些操作修改了視圖狀态,我猜測你可能使用了ajax并在用戶端用javascript動态添加了某些項

1. 在出錯頁面的 <%@ page %>中加enableviewstatemac="false"無效。 

2. 在web.config的 <system.web>節中加

我的問題是加入:

解決

最重要的是檢查自己的頁面,很可能是你的頁面中的問題,多注意下,肯定能發現問題,而這個問題并沒有報出你想要的錯誤 !!!      

是以,不一定所有的解決方案都适合你!!!

問題:驗證視圖狀态 MAC 失敗。如果此應用程式由網絡場或群集承載,請確定 <machineKey> 配置指定了相同的 validationKey 和驗證算法。不能在群集中使用 AutoGenerate

當runat="server"的表單通過修改action送出資料到其它頁面時,也會引發這個問題。

如:

document.forms[0].action = "AttachmentAdd.aspx";

document.forms[0].submit();

主要的原因是送出了名為__VIEWSTATE的資料,ASP.NET的驗證視圖狀态的時候失敗。

有送出前禁用__VIEWSTATE即可:

$("#__VIEWSTATE").attr("disabled", true);

下面是網絡上其它解決這個問題的建議,希望對你有所幫助:

1、去掉 runat="server"

2、添加enableEventValidation="false" enableViewStateMac="false"

或在webconfig中添加<pages enableEventValidation="false" enableViewStateMac="false" />

3、在webconfig中添加:<machineKey validation="3DES" validationKey="319B474B1D2B7A87C996B280450BB36506A95AEDF9B51211" decryption="3DES" decryptionKey="280450BB36319B474C996B506A95AEDF9B51211B1D2B7A87" />

4、不使用跨頁面送出,送出到本頁後在page.load中redirect.

5、使用 <asp:Button runat="server" PostBackUrl="~/Register/DoRegister.aspx" Text="送出" />

============================ End

繼續閱讀