Настройка проверки подлинности постоянных форм на нескольких серверах и поддоменах - PullRequest
5 голосов
/ 14 февраля 2012

Я пытаюсь настроить проверку подлинности на нескольких серверах и поддоменах.У меня есть статические машинные ключи, настроенные для каждого приложения, например:

<system.web>
    <machineKey validationKey="574...7A7" 
                decryptionKey="2C3...A0D" 
                validation="HMACSHA256" 
                decryption="AES" />
</system.web>

... и моя проверка подлинности форм настроена одинаково для каждого приложения:

<forms loginUrl="/login" timeout="2880" defaultUrl="/" path="/" name=".SHAREDAUTH" domain="domain.com" protection="All" />

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

Это прекрасно работает на моей локальной машине с отдельными сайтами, настроенными в IIS для каждого субдомена.Он также отлично работает на нашем сервере разработки, где все сайты все еще находятся на одной машине.Однако при развертывании в нашей промежуточной среде междоменная аутентификация перестает работать.В этой среде у меня основной сайт (где происходит вход в систему) работает на одном сервере, а дополнительный сайт (где должна сохраняться моя аутентификация) работает на двух серверах с балансировкой нагрузки.Все они работают под управлением IIS 7 в Windows 7 (локально) или Server 2008 R2 (разработка и подготовка).

Я проверил, что ключи машины совпадают, кодировав строку на первичном сайте с помощью MachineKey.Encodeи расшифровывая результат на вторичном сервере с помощью MachineKey.Decode., я также проверил, что файл cookie .SHAREDAUTH передается второму приложению в запросе, как путем проверки заголовков запроса в соответствии с сообщениями Firefox и Chrome, так и с помощью отладчика на * 1013.* и Application_AuthenticateRequest. Я вижу cookie во время выполнения Application_BeginRequest, но он исчезает, когда вызывается Application_AuthenticateRequest.Из того, что я могу понять, это, кажется, означает, что десериализация билета аутентификации не удалась, но я не могу понять, почему это может происходить в многосерверной среде, но не в среде с одним сервером, кроме разных ключей компьютера, что я уже подтвердил, что это не тот случай.

У меня также есть настраиваемые MembershipProvider и RoleProvider, и они отлично работают независимо на каждом сайте.

Чего мне не хватает?

Ответы [ 2 ]

3 голосов
/ 17 февраля 2012

Итак, после долгого времени я обнаружил бюллетень по безопасности MS MS11-100 , который исправляет уязвимость повышения привилегий в проверке подлинности на основе форм. К сожалению, патч не имеет обратной совместимости. Он был применен к нашим серверам с балансировкой нагрузки, но не к серверу, на котором размещено приложение, которое создало первоначальный вход в систему, что означало, что сбалансированные серверы не могли десериализовать билет аутентификации, написанный сервером приложений.

Согласно статье руководства по развертыванию MS , если вы оказались в такой ситуации, вы можете добавить

<add key="aspnet:UseLegacyFormsAuthenticationTicketCompatibility" value="true" />

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

0 голосов
/ 31 октября 2012

Для меня это работает, добавив следующие ключи в appsettings:

    <add key="aspnet:UseLegacyEncryption" value="true" />
    <add key="aspnet:UseLegacyFormsAuthenticationTicketCompatibility" value="true" />
...