Incluir chave do computador no machine.config no ambiente de balanceamento de carga para várias versões do framework .net

5

Eu tenho dois servidores da web atrás de um balanceador de carga F5. Cada servidor da web possui aplicativos idênticos para o outro. Não houve nenhum problema até que a configuração do balanceador de carga fosse alterada de persistência de endereço de origem para menos conexões.

Agora, em algumas aplicações, recebo este erro

Server Error in '/' Application.

Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that configuration specifies the same validationKey and validation algorithm. AutoGenerate cannot be used in a cluster. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Web.HttpException: Validation of viewstate MAC failed. If this application is hosted by a Web Farm or cluster, ensure that configuration specifies the same validationKey and validation algorithm. AutoGenerate cannot be used in a cluster.

Source Error:

The source code that generated this unhandled exception can only be shown when compiled in debug mode. To enable this, please follow one of the below steps, then request the URL:

  1. Add a "Debug=true" directive at the top of the file that generated the error. Example:

or:

2) Add the following section to the configuration file of your application:

Note that this second technique will cause all files within a given application to be compiled in debug mode. The first technique will cause only that particular file to be compiled in debug mode.

Important: Running applications in debug mode does incur a memory/performance overhead. You should make sure that an application has debugging disabled before deploying into production scenario.

Como eu adiciono uma chave de máquina ao arquivo machine.config? Eu faço isso no nível do servidor no IIS ou no nível de site / aplicativo para cada site? As chaves de validação e decriptografia devem ser as mesmas em ambos os servidores da web ou são diferentes? Eles devem ser diferentes para cada versão machine.config de .net?

Não consigo encontrar nenhuma documentação deste cenário.

    
por davidb 05.11.2012 / 15:43

1 resposta

7

Se você só precisa dele para o seu site, você pode adicioná-lo ao web.config do seu site. Se houver vários sites / aplicativos que precisem usar a mesma machineKey para criptografar / descriptografar, é nesse momento que você usaria um arquivo de configuração no escopo da máquina.

E sim, eles devem ser iguais em todos os servidores do farm, e você deve fazer isso para cada machine.config da pasta .NET (.NET 2.0 + 4.0 e x86 + x64, portanto, você pode estar atualizando quatro arquivos ).

Aqui está um código de exemplo que você pode usar para gerar suas chaves:

/// <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();
}

Aqui está um exemplo de um machine.config:

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

Arquivos:

% 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

    
por 05.11.2012 / 18:44