天天看點

多台伺服器,asp.net頁面報錯

如果你的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>

繼續閱讀