Идентификатор сеанса ASP.NET, общий для вкладок браузера - PullRequest
8 голосов
/ 19 октября 2010

Недавно я разрабатывал веб-сайт, используя веб-формы asp.net, которые используются в сессиях proc, и я заметил, что идентификаторы сессий являются общими для вкладок браузера.Поэтому мне было интересно, что бы вы сделали для следующих ситуаций:

Проблема: Несколько входов в систему с разными пользователями в одной проблеме браузера

  1. Пользователь открывает вкладку браузера1, входы в систему с помощью «user1» - сохранение в сеансе
  2. Пользователь открывает вкладку браузера 2, входы в систему с помощью «user2» - сохранение в сеансе
  3. На этом этапе информация о сеансе теперь указывает на «user2»из-за того, как идентификатор сеанса распределяется между вкладками браузера
  4. Пользователь пытается выполнить действие на вкладке 1, и вдруг у него появляется информация "user2"

Как вы предупреждаете пользователя вВкладка 1, что пользователь изменил или как заставить пользователя tab1 выйти из системы?

Первоначально я хотел сохранить список активных пользователей с идентификатором сеанса через базу данных или объект приложения, но проблема, с которой я столкнулсяв том, что на вкладке 1 я собираюсь сравнить список с тем, когда я делаю запрос, HttpContext.Current.User будет обновлен на «user2», как я знаю, что вкладка 1 браузера изначально была для «нас»er1 "

Благодарим всех, кто сообщил мне о любых альтернативах или передовых методах решения вышеуказанной проблемы

С уважением, DotnetShadow

Ответы [ 6 ]

7 голосов
/ 19 октября 2010

Почему вы не предупреждаете, когда user2 входит в систему?С сообщением типа «Вы уже вошли как user1, вы уверены, что хотите войти снова как другой пользователь?»

2 голосов
/ 19 октября 2010

Некоторые предлагают добавить в URL уникальные символы и отслеживать их на основе.

Если вы собираетесь это сделать, вы можете просто позволить ASP.Net сделать это за вас, включив сеансов без файлов cookie - затем используется URL-адрес для хранения идентификатора сеанса.

1 голос
/ 19 октября 2010

Чтобы избежать этой проблемы, я делаю перенаправление, чтобы добавить короткий, произвольный идентификатор входа в URL.

Затем, вместо непосредственного использования сеанса, я сохраняю строго типизированный объект в переменных сеанса подслучайный in-url-код и использовать этот объект для хранения сеанса.Если вы хотите сохранить простоту, вы можете использовать словарь.В дополнение к обычному тайм-ауту сеанса вы должны следить за последним использованием каждого идентификатора входа в систему и вручную устанавливать тайм-аут сеанса, если он слишком старый, чтобы новые пользователи не могли сохранить старые логины.

По существу, тогдакаждый сеанс ASP.NET соответствует любому количеству сеансов входа в систему.

Это имеет следующие преимущества:

  • Вы можете войти в систему как несколько пользователей одновременно.Это удобно для многих сайтов.
  • В общественных терминалах это помогает избежать случайного перехвата сеанса.Когда пользователь покидает общедоступный терминал, закрывает вкладку веб-приложения, но не браузер (что является довольно распространенным явлением), а затем другой пользователь подходит к этому терминалу и открывает новое окно или вкладку для вашего сайта, этот новый пользователь не видит следов ранее зарегистрированногов пользователя.Конечно, пользователи должны выйти из системы, и любой может проверить историю, но нет никаких оснований для приглашения злоупотреблений.
  • CSRF атак противВаш сайт немного сложнее, так как URL без случайного идентификатора входа не имеет смысла.
  • Реализация довольно проста, если вы используете хеш-таблицу - в конце концов, любой пользователь состояния сеанса уже написан для хранения и извлеченияданные из хеш-таблицы, вам просто нужно изменить хеш-таблицу, которую он использует, и в идеале она должна включать настраиваемое время ожидания.

Очевидным недостатком является то, что вам нужно включить случайный код в URL;и что вам нужно немного дополнительной реализации.Вы можете скрыть дополнительный код, используя сайт на основе iframe и / или javascript + XHR, но это намного более инвазивное изменение сайта.Наконец, обратите внимание, что сеансы без cookie - это не одно и то же;хотя их проще включить, они содержат гораздо более длинный, менее понятный человеку маркер URL-адреса, и из-за отсутствия обычного маркера сеанса cookie также менее безопасны по сравнению с перехватом сеанса (поскольку внезапно любая другая программа или даже машина, которая обнаруживаетID сеанса может выдавать себя за этого пользователя).

1 голос
/ 19 октября 2010

Все вкладки в браузере принадлежат одному и тому же экземпляру, поэтому все вкладки совместно используют файлы cookie и сеансы, с этим ничего не поделаешь. Если вы хотите реализовать это плохо, единственное решение, которое приходит на ум, - это перенос уникального идентификатора сеанса с каждым URL. На основе этого уникального идентификатора вы можете связать конкретного пользователя. Вам нужно будет настроить логику сеанса и убедиться, что все ссылки на вашем сайте содержат этот уникальный идентификатор. Это может быть сделано с большим количеством усилий, но реальный вопрос, стоит ли это делать?

1 голос
/ 19 октября 2010

Вот только как это.Вы не можете ничего с этим поделать.В настоящее время пользователи привыкли к такому поведению, так как оно согласуется с такими известными интернет-сайтами, как gmail и т. Д., Поэтому для них это не должно быть большой проблемой.

0 голосов
/ 19 октября 2010

Как насчет хранения данных в viewstate? Это было бы уникально для каждого окна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...