Dot-Net

將機器密鑰添加到負載平衡環境中的 machine.config 到多個版本的 .net 框架

  • November 6, 2012

我在 F5 負載均衡器後面有兩個 Web 伺服器。每個 Web 伺服器都具有彼此相同的應用程序。在負載均衡器的配置從源地址持久性更改為最少連接之前沒有問題。

現在在某些應用程序中,我收到此錯誤

“/”應用程序中的伺服器錯誤。

視圖狀態 MAC 驗證失敗。如果此應用程序由 Web Farm 或集群託管,請確保配置指定相同的 validationKey 和驗證算法。AutoGenerate 不能在集群中使用。說明:執行目前 Web 請求期間發生未處理的異常。請查看堆棧跟踪以獲取有關錯誤及其源自程式碼的位置的更多資訊。

異常詳細資訊:System.Web.HttpException:視圖狀態 MAC 驗證失敗。如果此應用程序由 Web Farm 或集群託管,請確保配置指定相同的 validationKey 和驗證算法。AutoGenerate 不能在集群中使用。

源錯誤:

生成此未處理異常的原始碼只能在調試模式下編譯時顯示。要啟用此功能,請按照以下步驟之一,然後請求 URL:

  1. 在產生錯誤的文件頂部添加“Debug=true”指令。例子:

或者:

  1. 將以下部分添加到應用程序的配置文件中:

請注意,第二種技術將導致給定應用程序中的所有文件都以調試模式編譯。第一種技術將導致僅在調試模式下編譯該特定文件。

重要提示:在調試模式下執行應用程序確實會產生記憶體/性能成本。在部署到生產場景之前,您應該確保應用程序已禁用調試。

如何將機器密鑰添加到 machine.config 文件?我是在 IIS 的伺服器級別還是在每個站點的網站/應用程序級別執行此操作?兩個 Web 伺服器的驗證和解密密鑰是否必須相同,或者它們是否不同?對於每個 machine.config 版本的 .net,它們是否應該不同?

我找不到這種情況的任何文件。

如果您只需要它用於您的網站,您可以將它添加到您的網站的 web.config。如果有多個站點/應用程序需要使用相同的 machineKey 進行加密/解密,那麼您將使用機器範圍的配置文件。

是的,它們在場中的所有伺服器上都應該是相同的,並且您應該為每個 .NET 文件夾的 machine.config(.NET 2.0 + 4.0 和 x86 + x64,因此您可能要更新四個文件)執行此操作。

以下是一些可用於生成密鑰的範常式式碼:

/// <summary>
/// http://msdn.microsoft.com/en-us/library/w8h3skw9.aspx
/// </summary>
public static string CreateMachineKey(int characterLength)
{
   /*
    * decryptionKey:
    * DES: 64 bits (16 hexadecimal characters)
    * 3DES:192 bits (48 hexadecimal characters)
    * AES: 128 bits (32 characters), 192 bits (48 characters), or 256 bits (64 characters)
    * 
      validationKey:
       AES requires a 256-bit key (64 hexadecimal characters).
       MD5 requires a 128-bit key (32 hexadecimal characters).
       SHA1 requires a 160-bit key (40 hexadecimal characters).
       3DES requires a 192-bit key (48 hexadecimal characters).
       HMACSHA256 requires a 256-bit key (64 hexadecimal characters).
       HMACSHA384 requires a 384-bit key (96 hexadecimal characters).
       HMACSHA512 requires a 512-bit key (128 hexadecimal characters).

   */
   byte[] byteArray = new byte[characterLength / 2];
   RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
   rng.GetBytes(byteArray);
   StringBuilder sb = new StringBuilder(characterLength);
   for (int i = 0; i < byteArray.Length; i++)
   {
       sb.Append(string.Format("{0:X2}", byteArray[i]));
   }
   Debug.WriteLine(sb);
   return sb.ToString();
}

這是 machine.config 的範例:

<system.web>
   <machineKey 
   decryption="AES" 
   decryptionKey="D416EFCFEC011CC3A8F0F72A15E7EF725AA39FDBCE3CA361"
   validation="HMACSHA256" 
   validationKey="EF4BFB4B2E1A9AB427430897A13528E4530A231112014E070B246DCA7383EB7F4163D685F590E9B54005F5215AD3BA7CE4EA7D404FE310C543D100D09CC00AE2"/>
</system.web>

文件:

%SYSTEMROOT%\Microsoft.NET\Framework\v4.0.30319\CONFIG\machine.config

%SYSTEMROOT%\Microsoft.NET\Framework64\v4.0.30319\CONFIG\machine.config

%SYSTEMROOT%\Microsoft.NET\Framework\v2。 0.5727\CONFIG\machine.config

%SYSTEMROOT%\Microsoft.NET\Framework64\v2.0.5727\CONFIG\machine.config

引用自:https://serverfault.com/questions/445609