Разрешить только одну одновременную регистрацию для пользователя в ASP.NET
Можно ли разрешить только одну одновременную регистрацию для пользователя в веб-приложении ASP.NET?
Я работаю над веб-приложением, в котором я хочу убедиться, что веб-сайт допускает только один вход в систему для каждого пользователя за раз. Как проверить, что текущий пользователь уже залогинился или нет?
Пожалуйста, предложите правильный метод входа, с помощью которого мы можем решить эту проблему. Я думаю, что мы должны использовать состояние сеанса SQL Server для решения этой проблемы. Что вы предлагаете?
Я думал об одном решении для этого. Мы можем сделать что-то вроде:
Когда пользователь входит в систему, мы вставляем идентификатор сеанса в столбец пользователя. (Мы будем использовать сеанс базы данных, чтобы можно было легко получать все связанные с сеансом данные, такие как isexpired, expiredatetime и т.д.).
Когда один и тот же пользователь пытается войти во второй раз, мы проверим столбец идентификатора сеанса и проверим, что сеанс уже истек или нет. Если сеанс не истек, мы не позволим пользователю войти в систему.
Обновляйте идентификатор сеанса пользователя каждый раз, когда пользователь выходит из системы.
Пожалуйста, предложите, является ли это правильным способом или нет.
Ответы
Ответ 1
Обратитесь к:
Когда один и тот же идентификатор пользователя пытается войти на несколько устройств, как мне убить сеанс на другом устройстве?
Из коробки .NET не поддерживает это..NET допускает параллельные входы в систему, так как я уверен, что вы знаете.
У меня было такое же точное требование, и вышло с довольно гладким решением, продемонстрированным в ссылке выше. В двух словах, мое требование состояло в том, чтобы только один вход пользователя в систему происходил за один раз. Если тот же идентификатор пользователя попытался войти в другое место, он убил сеанс для первого входа в систему, проверив наличие существующего входа в систему под другим идентификатором сеанса (это позволило идентификатору пользователя войти в систему из нескольких экземпляров их веб-браузер на своем компьютере [тот же самый идентификатор сеанса], который является общим, но не с другого компьютера [другой идентификатор сеанса] (возможно, из-за того, кто украл их учетные данные, например)). С помощью модификации кода вы, вероятно, можете изменить поведение этого, т.е. Предотвратить вторую попытку входа в систему, вместо того, чтобы убить первый вход в систему, который уже активен и используется.
Конечно, он может не соответствовать 100% тому, что вам нужно, поэтому не стесняйтесь изменять его в соответствии с вашими потребностями.
Ответ 2
Вы можете создать запись в кэше для каждого пользователя и сохранить в нем его идентификатор сессии. Идентификатор сеанса будет уникальным для каждого сеанса браузера. На странице входа в систему вы можете создать эту запись в кэше, когда они успешно войдут в систему:
if(Cache.ContainsKey["Login_" + username])
// Handle "Another session exists" case here
else
Cache.Add("Login_" + username, this.Session.SessionID);
(Код набирается в текстовом поле без проверки синтаксиса. Предположим, "псевдокод".)
В global.asax вы можете подключиться к Session_End и завершить эту запись в кэше пользователя. Смотрите о событиях global.asax.
if(Cache.ContainsKey["Login_" + username])
Cache.Remove("Login_" + username);
Ответ 3
Вы можете добавить столбец флага в пользовательскую таблицу, который указывает, что пользователь в настоящий момент зарегистрирован.
Когда пользователь пытается войти в систему, вы проверяете флаг, если он истинен (теперь учетная запись пользователя уже используется), тогда вы не разрешаете новому пользователю входить в систему, если флаг является ложным, пользователям разрешено регистрироваться так как в настоящее время учетная запись не используется кем-либо еще.
Помните, что, если использование активно не выходит из системы, вы не можете знать, когда пользователи переходят на что-то другое (идет на другой сайт или закрывает браузер и т.д.), поэтому вам нужно установить какой-то тайм-аут сеанса, который будет автоматически выйдите из системы, если в течение указанного периода не будет новых запросов.
Это означает, что если пользователь закрывает свой браузер и пытается войти на мобильное устройство, например, он/она не сможет войти в систему до истечения указанного таймаута сеанса, поэтому дайте тайм-ауту немного подумал, что вы не хотите, чтобы пользователь быстро вышел из системы (если он читает длинную страницу и т.д.), и вы не хотите, чтобы пользователи не могли входить в систему на другом устройстве часами, если он/она забыла выйти из дома, прежде чем покинуть дом.
Ответ 4
Учетные данные для входа хранятся в файле cookie, поэтому , чтобы знать, зарегистрирован ли пользователь, вам необходимо сохранить эту информацию на сервере, предпочитаемый в базе данных, поскольку база данных может быть единственным распространенным местом среди веб-сада или веб-фермы.
Что вы можете сохранить, находится на столе, что user A
зарегистрирован или нет, отметьте его, что вышло из системы, возможно, последнее взаимодействие с пользователем, чтобы иметь тайм-аут и т.д.
Итак, скажем, что пользователь A, вошел в систему, затем вы открываете флаг в базе данных для этого пользователя, который теперь входит в систему, и если он пытается снова войти в систему, вы его не выпускаете.
Чтобы выполнить эту работу, вам нужно либо сказать своим пользователям, чтобы они выходили из системы, либо сохраняли тайм-аут, похожий на время ожидания учетных данных.
Ответ 5
Если вы используете систему идентификации, эта ссылка поможет вам как подключиться к одному пользователю на нескольких устройствах.
Предотвращение множественного входа в Identity Asp.Net
Я попробовал, чтобы они отлично работали в моем проекте Asp.net Mvc.
Ответ 6
Решение может быть таким:
Добавьте новый столбец в свою таблицу входа в систему GuidCode
.
Шаг 1: при входе в систему проверьте, является ли GuidCode
в базе данных null
.
Шаг 2: обновите GuidCode
с помощью нового guid и сохраните его в сеансе.
Шаг 3: Если это не null
, тогда возьмите указатель из сеанса и сравните со значением базы данных GuidCode
.
Шаг 4: если это то же самое, то разрешите вход в систему: