Разрешить только одну одновременную регистрацию для пользователя в ASP.NET

Можно ли разрешить только одну одновременную регистрацию для пользователя в веб-приложении ASP.NET?

Я работаю над веб-приложением, в котором я хочу убедиться, что веб-сайт допускает только один вход в систему для каждого пользователя за раз. Как проверить, что текущий пользователь уже залогинился или нет?

Пожалуйста, предложите правильный метод входа, с помощью которого мы можем решить эту проблему. Я думаю, что мы должны использовать состояние сеанса SQL Server для решения этой проблемы. Что вы предлагаете?

Я думал об одном решении для этого. Мы можем сделать что-то вроде:

  1. Когда пользователь входит в систему, мы вставляем идентификатор сеанса в столбец пользователя. (Мы будем использовать сеанс базы данных, чтобы можно было легко получать все связанные с сеансом данные, такие как isexpired, expiredatetime и т.д.).

  2. Когда один и тот же пользователь пытается войти во второй раз, мы проверим столбец идентификатора сеанса и проверим, что сеанс уже истек или нет. Если сеанс не истек, мы не позволим пользователю войти в систему.

  3. Обновляйте идентификатор сеанса пользователя каждый раз, когда пользователь выходит из системы.

Пожалуйста, предложите, является ли это правильным способом или нет.

Ответ 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: если это то же самое, то разрешите вход в систему: