Я размещаю два веб-приложения в IIS 7.5. Они должны совместно использовать файл cookie проверки подлинности форм ASP.NET. Поскольку я не хочу помещать машинный ключ в Web.config (я не использую веб-фермы и не хочу, чтобы ключ отображался в файле web.config), я установил для него автоматическое создание с помощью следующая настройка:
<machineKey validationKey="AutoGenerate" decryptionKey="AutoGenerate" />
В соответствии с документация, это должно привести к тому, что IIS автоматически сгенерирует один и тот же машинный ключ для двух веб-приложений. На моих машинах разработчика Windows 7 и Windows 8 это работает, как ожидалось. Любое веб-приложение может аутентифицировать пользователя, и оба приложения распознают один и тот же файл cookie аутентификации.
Но когда я перемещаю эту настройку в производственную среду, работающую на Windows Server 2008 R2, два приложения не будут совместно использовать cookie проверки подлинности. Когда WebAppA аутентифицирует пользователя, WebAppB не может расшифровать cookie аутентификации и вынуждает пользователя повторно аутентифицироваться. Когда они это сделают, новый файл cookie аутентификации недействителен для WebAppA.
Я доказал, что он использует отдельные машинные ключи, явно установив для машинного ключа в обоих приложениях один и тот же ключ:
<machineKey validationKey="F801AB..." decryptionKey="ADB3C1..." />
Когда я это делаю, аутентификация работает так же, как на моих машинах разработчика.
Какая разница между моей средой разработки и производственной средой может вызывать это?
Когда IIS автоматически генерирует машинный ключ, он сохраняется в HKEY_CURRENT_USER. Следовательно, для совместного использования автоматически сгенерированных машинных ключей веб-приложения должны запускаться от имени одного и того же пользователя. Подробности в это сообщение в блоге. Соответствующий отрывок:
Ключ базовой машины хранится в реестре в следующем месте:
HKCU\Software\Microsoft\ASP.NET\4.0.30319.0\AutoGenKeyV4
Обратите внимание, что этот ключ находится в кусте HKEY_CURRENT_USER, поэтому сгенерированный машинный ключ принадлежит пользователю, запускающему профиль приложения. Это означает, что если у вас есть два приложения в IIS, которые работают с одним и тем же идентификатором процесса, они будут использовать один и тот же машинный ключ!
В моем случае два веб-приложения работали в разных пулах приложений под разными идентификаторами. Поэтому они генерировали разные машинные ключи. На моих машинах разработчика они работали под одним идентификатором.
Поместив два приложения в один пул приложений (или запустив оба пула приложений с одним и тем же идентификатором), они использовали один и тот же автоматически сгенерированный машинный ключ.