2 июля 2011 г.

machineKey и Web-фабрика

В конфигурационном файле web.config есть раздел machineKey. В этом разделе можно устанавливать специфический для каждого сервера ключ, который будет использоваться для шифрования данных (например, во ViewState) и создания цифровых подписей. Обычно там указывается, что ключи должны генерироваться автоматически.

Но что делать, если на вашем хостинге используется Web-фабрика, т.е. одно и то же приложение запускается на множестве компьютеров? Если вы запросите страницу - она вначале будет обработана одним сервером, после чего вы отсылаете страницу, которая будет обрабатываться уже другим сервером, то второй сервер не сможет расшифровать состояние просмотра и cookie-файлы форм из первого сервера.

Чтобы решить эту проблему, вам нужно явным образом определить ключи validationKey и decryptionKey в machineKey:
<machineKey validationKey="6AF567A161DC96137E92FFD7FA3E5D1F7915C8CAD80F64E5460B8D87FB43E696F4F494F26A804CA04EF7CF2DF6EF9787FA7B9F9511FFE59DBF10941E7A53A1D1" decryptionKey="2DFB44AB71DDB59D24E714DC20759BFDA027ED89B2E7502C" validation="SHA1" />
Но если вы напишете эти ключи вручную, это будет не совсем случайно. Поэтому предлагаю использовать вот такой метод:
public static string CreateMachineKey(int length)
{
byte[] random = new byte[length / 2];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(random);
StringBuilder machineKey = new StringBuilder(length);
for (int i = 0; i < random.Length; i++)
{
machineKey.Append(string.Format("{0:X2}", random[i]));
}
return machineKey.ToString();
}
Здесь используется криптографически строгий генератор случайных чисел. Каждое случайное число отображается в шестнадцатеричном формате.

Далее, для генерации готового раздела machineKey можно воспользоваться вот такой конструкцией:
string.Format("<machineKey validationKey=\"{0}\" decryptionKey=\"{1}\" validation=\"SHA1\" />", CreateMachineKey(128), CreateMachineKey(48));
Полученную строку нужно будет скопировать в конфигурационный файл.

Для обеспечения максимальной криптозащиты, validationKey должен быть длиной 128 символов, а decryptionKey - 48.

Комментариев нет:

Отправить комментарий