Назад | Перейти на главную страницу

Добавьте машинный ключ в machine.config в среде балансировки нагрузки в несколько версий .NET Framework

У меня есть два веб-сервера за балансировщиком нагрузки F5. Каждый веб-сервер имеет идентичные приложения для другого. Не было проблем, пока конфигурация балансировщика нагрузки не изменилась с сохранения адреса источника на минимальное количество подключений.

Теперь в некоторых приложениях я получаю эту ошибку

Ошибка сервера в приложении '/'

Ошибка проверки MAC состояния просмотра. Если это приложение размещено на веб-ферме или кластере, убедитесь, что в конфигурации указан один и тот же ключ проверки и алгоритм проверки. AutoGenerate нельзя использовать в кластере. Описание: необработанное исключение произошло во время выполнения текущего веб-запроса. Просмотрите трассировку стека для получения дополнительных сведений об ошибке и ее происхождении в коде.

Сведения об исключении: System.Web.HttpException: ошибка проверки MAC состояния просмотра. Если это приложение размещено на веб-ферме или кластере, убедитесь, что в конфигурации указан один и тот же ключ проверки и алгоритм проверки. AutoGenerate нельзя использовать в кластере.

Ошибка источника:

Исходный код, создавший это необработанное исключение, может быть показан только при компиляции в режиме отладки. Чтобы включить это, выполните одно из следующих действий, а затем запросите URL-адрес:

  1. Добавьте директиву Debug = true в начало файла, вызвавшего ошибку. Пример:

или:

2) Добавьте следующий раздел в файл конфигурации вашего приложения:

Обратите внимание, что этот второй метод приведет к компиляции всех файлов в данном приложении в режиме отладки. Первый метод приведет к компиляции только этого конкретного файла в режиме отладки.

Важно: Запуск приложений в режиме отладки вызывает накладные расходы на память / производительность. Перед развертыванием в производственном сценарии необходимо убедиться, что в приложении отключена отладка.

Как добавить машинный ключ в файл machine.config? Я делаю это на уровне сервера в IIS или на уровне веб-сайта / приложения для каждого сайта? Должны ли ключи проверки и дешифрования быть одинаковыми на обоих веб-серверах или они разные? Должны ли они быть разными для каждой версии 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