У вас есть две проблемы здесь:
1) Разрешение только одному подключенному пользователю в сценарии веб-фермы
2) Обнаружение выхода пользователя из системы
Чтобы решить первое, единственное решение - это центральное хранилище для некоторой пользовательской среды, использующее центральный сервер для хранения сеанса ASP.Net или какой-либо другой тип централизованной пользовательской среды. Этим центральным хранилищем может быть SQL Server, использующий встроенное управление состоянием сеанса (кстати, Oracle, из Oracle 11, может поддерживать хранилище сеансов), службу AspState или внешнее решение, такое как ScaleOut (как вы сказали) или его альтернативу с открытым исходным кодом memcached (см. https://sourceforge.net/projects/memcacheddotnet/). Или вы можете создать простой централизованный веб-сервис, который проверяет активные входы в систему для базы данных SQL Server, таким образом, вы также можете быстро создавать инструменты отчетности о зарегистрированных пользователях и т. д.
Реальная проблема, на мой взгляд, заключается во второй части, которая заключается в том, что вам необходимо поддерживать различные сценарии «неправильного выхода из системы», которые доступны в веб-мире (например, закрытие браузера из-за сбоя или завершение работы приложений без выхода из системы), предоставление вашему приложению некоторого способа изящно работать с пользователем, у которого включен старый сеанс (как вы сказали, просто истечение срока первого сеанса может работать).
Имейте также в виду, что использование сервера состояний, такого как SQL-сервер, не приведет к потере сбалансированных серверов. Если это способ работы в среде веб-фермы и сеанса общего доступа, только проблема заключается в производительности (если состояние сеанса становится большим) и стоимость использования SQL Server, если у вас еще нет соответствующей лицензии.