Событие Session_End не срабатывает, когда браузер закрыт, оно срабатывает, когда сервер не получил запрос от пользователя за определенное время (по умолчанию 20 минут). Это означает, что если вы используете Session_End для удаления пользователей, они будут оставаться в чате в течение 20 минут после закрытия браузера.
Я предлагаю вам сохранить время последнего запроса в объекте пользователя. Таким образом, вы можете определить, насколько активен пользователь и насколько вероятно, что он покинул чат. Например, вы можете показать любого пользователя, который ничего не делал в течение двух минут, неактивным.
Вы также можете разрешить приложению чата периодически опрашивать сервер (если вы этого еще не сделали). Это обновит время последнего запроса в объекте и сохранит пользователя живым, пока открыто окно чата.
Вы можете использовать событие onunload в браузере для отправки запроса на выход на сервер, когда пользователь покидает страницу. Это, конечно, работает, только если у пользователя все еще есть сетевое соединение. Событие onunload также запускается при перезагрузке страницы, поэтому вам придется отслеживать, почему событие запускается для его использования.