Это буквально сводит меня с ума - я нахожусь в отпуске с завтрашнего дня, но если я не могу заставить это работать сегодня, то это под угрозой - поэтому любая помощь очень ценится!
Во-первых, на моем веб-сайте задан элемент <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
с - но это не так - так есть идеи, что происходит !!?
Заранее спасибо!