Назад | Перейти на главную страницу

ASP.NET MVC, IIS 7.5 - потеря сеансов между серверами (с балансировкой нагрузки)

У нас есть сайт, работающий на 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");
}

Скорее всего, это связано с тем, что на ваших новых серверах установлен другой набор исправлений, чем на старых. Даже если ключ проверки и расшифровка совпадают, новые серверы не будут генерировать токены, действительные на старых. См. Этот вопрос для приоритета.

Вероятно, вы можете решить эту проблему, убедившись, что все ваши серверы полностью обновлены.