将机器密钥添加到负载平衡环境中的machine.config以多个版本的.net框架

我在F5负载均衡器后面有两个Web服务器。 每个Web服务器都有相同的应用程序。 在负载均衡器的configuration从源地址持久性更改为最less连接之前没有问题。

现在在一些应用程序中,我接受了这个错误

“/”应用程序中的服务器错误。

视图状态validation失败。 如果此应用程序由Web场或群集托pipe,请确保configuration指定相同的validation密钥和validationalgorithm。 AutoGenerate不能在群集中使用。 说明:执行当前Web请求期间发生未处理的exception。 请查看堆栈跟踪,了解有关错误的更多信息以及源代码的位置。

exception详细信息:System.Web.HttpException:validationviewstate MAC失败。 如果此应用程序由Web场或群集托pipe,请确保configuration指定相同的validation密钥和validationalgorithm。 AutoGenerate不能在群集中使用。

源错误:

生成此未处理exception的源代码只能在debugging模式下编译时显示。 要启用此function,请按照以下任一步骤操作,然后请求url:

  1. 在生成错误的文件的顶部添加一个“Debug = true”指令。 例:

要么:

2)将以下部分添加到应用程序的configuration文件中:

请注意,这第二种技术将导致给定应用程序内的所有文件都以debugging模式进行编译。 第一种技术只会导致在debugging模式下编译特定的文件。

重要提示:在debugging模式下运行应用程序会产生内存/性能开销。 在部署到生产场景之前,应确保应用程序已禁用debugging。

如何将机器密钥添加到machine.config文件? 我是否在IIS的服务器级别或每个站点的网站/应用程序级别执行此操作? validation密钥和解密密钥在两个Web服务器上必须相同还是不同? 他们应该不同的每个machine.config版本的.net

我找不到这种情况的任何文件。

如果您只需要它为您的网站,您可以将其添加到您的网站的web.config。 如果有多个站点/应用程序需要使用相同的machineKey来进行encryption/解密,那么您将使用机器范围的configuration文件。

是的,它们应该在服务器场中的所有服务器上都是相同的,您应该为每个.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 \框架\ v4.0.30319 \ CONFIG \ machine.config中
%SYSTEMROOT%\ Microsoft.NET \ Framework64 \ v4.0.30319 \ CONFIG \ machine.config中
%SYSTEMROOT%\ Microsoft.NET \框架\ v2.0.5727 \ CONFIG \ machine.config中
%SYSTEMROOT%\ Microsoft.NET \ Framework64 \ v2.0.5727 \ CONFIG \ machine.config中