Проверка подлинности с помощью форм 4.0 в веб-ферме - PullRequest
5 голосов
/ 10 августа 2011

Это буквально сводит меня с ума - я нахожусь в отпуске с завтрашнего дня, но если я не могу заставить это работать сегодня, то это под угрозой - поэтому любая помощь очень ценится!

Во-первых, на моем веб-сайте задан элемент <machinekey />, определенный вручную, так что оба веб-сервера в веб-ферме синхронизированы. Я проверил это с менеджером IIS (следовательно, почему я спрашиваю, несмотря на сходство со многими другими вопросами). Это выглядит так (ключи пропущены, но имеют правильную длину):

<machineKey validationKey="[512 bit hex]" 
    decryptionKey="[256-bit hex]" 
    validation="SHA1" 
    decryption="AES" />

Сайт работает под управлением Asp.Net MVC3, и я использую проверку подлинности с помощью форм в «обычном» режиме (т.е. не в режиме сравнения 2.0). Я использую проверку подлинности с помощью форм для создания заявки на проверку подлинности, используя код, подобный следующему:

FormsAuthentication.SetAuthCookie(userName, false);

Конфигурация My Forms Auth очень проста; нет никаких настроек IIS или сервера, которые отменяют задокументированные значения по умолчанию:

<authentication mode="Forms">
  <forms defaultUrl="~/Unauthorised" 
   loginUrl="~/Unauthorised" 
   ticketCompatibilityMode="Framework40" />
</authentication>

А затем я похитил функцию чтения файлов cookie согласно этой теме MSDN , чтобы я мог создать участника и личность, которую я хочу.

Проблема в том, что только одна половина веб-фермы может расшифровать куки-файл аутентификации, а другая половина (то есть, какая бы пользователь не аутентифицировал пользователя) просто дает:

System.Security.Cryptography.CryptographicException: Length of the data to decrypt is invalid.

При этом в качестве верхней части трассировки стека:

[CryptographicException: Length of the data to decrypt is invalid.]
System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount) +12521039
System.Security.Cryptography.CryptoStream.FlushFinalBlock() +53
System.Web.Configuration.MachineKeySection.EncryptOrDecryptData(Boolean fEncrypt, Byte[] buf, Byte[] modifier, Int32 start, Int32 length, Boolean useValidationSymAlgo, Boolean useLegacyMode, IVType ivType) +331
System.Web.Security.FormsAuthentication.Decrypt(String encryptedTicket) +293

Мы используем немного древний (но очень надежный) балансировщик нагрузки - который не изменяет трафик HTTP - и трафик в этом случае - HTTP; Я могу убедиться, что это всегда один сервер, а не оба, используя Fiddler для расшифровки и проверки трафика.

Это явно указывает на несинхронизацию machineKey с - но это не так - так есть идеи, что происходит !!?

Заранее спасибо!

1 Ответ

5 голосов
/ 10 августа 2011

Когда разные серверы имеют разные патчи, он может изменить поведение шифрования (/ decryption), что может вызвать это исключение времени выполнения:

System.Security.Cryptography.CryptographicException: Length of the data to decrypt is invalid.

Более подробную информацию по этому вопросу можно найти здесь: http://blog.evonet.com.au/post/SystemSecurityCryptographyCryptographicException-Length-of-the-data-to-decrypt-is-invalid.aspx

...