將機器密鑰添加到負載平衡環境中的 machine.config 到多個版本的 .net 框架
我在 F5 負載均衡器後面有兩個 Web 伺服器。每個 Web 伺服器都具有彼此相同的應用程序。在負載均衡器的配置從源地址持久性更改為最少連接之前沒有問題。
現在在某些應用程序中,我收到此錯誤
“/”應用程序中的伺服器錯誤。
視圖狀態 MAC 驗證失敗。如果此應用程序由 Web Farm 或集群託管,請確保配置指定相同的 validationKey 和驗證算法。AutoGenerate 不能在集群中使用。說明:執行目前 Web 請求期間發生未處理的異常。請查看堆棧跟踪以獲取有關錯誤及其源自程式碼的位置的更多資訊。
異常詳細資訊:System.Web.HttpException:視圖狀態 MAC 驗證失敗。如果此應用程序由 Web Farm 或集群託管,請確保配置指定相同的 validationKey 和驗證算法。AutoGenerate 不能在集群中使用。
源錯誤:
生成此未處理異常的原始碼只能在調試模式下編譯時顯示。要啟用此功能,請按照以下步驟之一,然後請求 URL:
- 在產生錯誤的文件頂部添加“Debug=true”指令。例子:
或者:
- 將以下部分添加到應用程序的配置文件中:
請注意,第二種技術將導致給定應用程序中的所有文件都以調試模式編譯。第一種技術將導致僅在調試模式下編譯該特定文件。
重要提示:在調試模式下執行應用程序確實會產生記憶體/性能成本。在部署到生產場景之前,您應該確保應用程序已禁用調試。
如何將機器密鑰添加到 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