У нас есть сайт, работающий на 3 веб-узлах. Мы используем хранилище сеансов SQL Server.
Недавно мы добавили еще два, только чтобы обнаружить, что сеансы пользователей теряются, когда они отправляются на одну из этих машин.
Мы проверили идентификатор сайта, а также ключ проверки компьютера и ключ дешифрования.
РЕДАКТИРОВАТЬ:
Я забыл упомянуть, что рассматриваемая машина была клонированной (VMWare) версией существующей машины в ферме.
Решено - мы просто стерли новую машину и установили новую версию Server 08. Причина этой проблемы до сих пор неизвестна.
Вы подтвердили, что ключ машины работает? Один из способов сделать это - если у вас есть проверка подлинности с помощью форм, у вас может быть несколько строк кода, который пытается прочитать файл cookie проверки подлинности. Если машинный ключ недействителен, вы не сможете прочитать файл cookie, и User.Identity.IsAuthenticated будет ложным. Машинный ключ также необходим для состояния сеанса SQL, так что это основной подозреваемый.
Пример кода ниже.
Если у вас есть ключ в machine.config (вместо web.config), вы можете проверить, обновили ли вы правильный файл. Если у вас есть .NET 3 и 4, у вас может быть файл machine.config в четырех местах. Я обычно обновляю все четыре на всякий случай.
C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG \
C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ Config \
C: \ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727 \ Config \
C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Config \
Другая удаленная возможность - вы также можете указать свойство validation = "xxxx" для алгоритма хеширования машинного ключа. В .NET4 алгоритм хеширования по умолчанию - SHA256, но в предыдущих версиях это был SHA1. Поэтому обычно рекомендуется включить это, чтобы все они были одинаковыми.
Критические изменения ASP.NET 4 - теперь алгоритм хеширования по умолчанию HMACSHA256
Защищенный поставщик конфигурации. Совместное использование ключа компьютера в веб-ферме работает только с RsaProtectedConfigurationProvider. Если в web.config или machine.config указан только DpapiProtectedConfigurationProvider, это не сработает:
Указание поставщика защищенной конфигурации
http://msdn.microsoft.com/en-us/library/68ze1hb2%28v=VS.100%29.aspx
Пример кода проверки файлов cookie:
if (Request.Cookies[FormsAuthentication.FormsCookieName] != null)
{
try
{
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(Request.Cookies[FormsAuthentication.FormsCookieName].Value);
Debug.WriteLine(String.Format("Cookie timeout: {0}, ticket.Expiration.ToString("yyyy-MMM-dd HH:mm:ss")));
}
catch (Exception e)
{
Debug.WriteLine(String.Format("Error reading cookie: {0}", e.ToString()));
}
}
else
{
Debug.WriteLine("Cookie unavailable");
}
Скорее всего, это связано с тем, что на ваших новых серверах установлен другой набор исправлений, чем на старых. Даже если ключ проверки и расшифровка совпадают, новые серверы не будут генерировать токены, действительные на старых. См. Этот вопрос для приоритета.
Вероятно, вы можете решить эту проблему, убедившись, что все ваши серверы полностью обновлены.