如果你的Asp.Net程式執行時碰到這種錯誤:“驗證視圖狀态 MAC 失敗。如果此應用程式由網絡場或群集承載,請確定 <machineKey> 配置指定了相同的 validationKey 和驗證算法。不能在群集中使用 AutoGenerate。”那麼說明你沒有讓你的應用程式使用統一的machineKey,那麼machineKey的作用是什麼呢?按照MSDN的标準說法:“對密鑰進行配置,以便将其用于對 Forms 身份驗證 Cookie 資料和視圖狀态資料進行加密和解密,并将其用于對程序外會話狀态辨別進行驗證。”也就是說Asp.Net的很多加密,都是依賴于machineKey裡面的值,例如Forms 身份驗證 Cookie、ViewState的加密。預設情況下,Asp.Net的配置是自己動态生成,如果單台伺服器當然沒問題,但是如果多台伺服器負載均衡,machineKey還采用動态生成的方式,每台伺服器上的machinekey值不一緻,就導緻加密出來的結果也不一緻,不能共享驗證和ViewState,是以對于多台伺服器負載均衡的情況,一定要在每台站點配置相同的machineKey。
解決方案:
再您的項目的web.config裡添加一段代碼:
<system.web>
<machineKey validationKey="3FF1E929BC0534950B0920A7B59FA698BD02DFE8" decryptionKey="280450BB36319B474C996B506A95AEDF9B51211B1D2B7A77" decryption="3DES" validation="SHA1"/>
</system.web>
附:
ASP.NET 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();
}
轉載自:
<a href="http://developer.51cto.com/art/200908/145676.htm" target="_blank">http://developer.51cto.com/art/200908/145676.htm</a>