i have similar situation in one of my project.
instead of dictionary, i used cache with a short absolute expiration and session id of user as my cache key:
HttpContext.Current.Cache.Insert(sessionID, userEntity, null, DateTime.Now.AddSeconds(30), TimeSpan.Zero);
and in the client side, i make an ajax call,every 15 seconds, to notify the server and renew the cache for that session id.
so whenever a user close his browser window, server doesn't recieve any notification and session id of user expired automatically.