2015-05-27 3 views
1

Я разрабатываю веб-сайт, где пользователю необходимо войти в систему, чтобы иметь возможность использовать его. Текущая функциональность: Когда пользователь вводит имя пользователя и пароль, в БД выполняется проверка, чтобы проверить, существует ли этот пользователь, и если он ввел правильный пароль. Только тогда разрешите этому пользователю войти в систему.Проверить, если пользователь уже зарегистрирован на сайте asp.net

Это было нормально до сих пор, теперь клиент хочет добавить еще одну функциональность к функции ведения журнала, то есть клиент хотел бы ограничить только один сеанс для этого пользователя.

ie. если пользователь1 зарегистрирован в одном браузере ПК, тогда ему необходимо, чтобы не разрешалось входить в систему из другой системы или другого браузера того же ПК.

Как это сделать? Я планировал сделать это, используя поле бит в моей базе данных, которое будет установлено, когда пользователь регистрируется в первый раз. И если он попытается выполнить регистрацию 2-го раза, проверьте это поле и разрешите логин только в том случае, если бит-бит не установлен.

Но я чувствую, что это вызовет проблемы,

1) если пользователь по ошибке закрывает вкладку браузера и пытается снова войти в систему, он не в состоянии сделать это, как битовое поле все равно будет установлен в DB

2) когда будет ли поле установки очищено, если пользователи по ошибке закрывают браузер?

Если есть какой-либо другой способ его реализации, тогда вы можете указать мне в правильном направлении.

Как указано некоторыми из участников, есть дубликаты этого вопроса, но эти вопросы на самом деле не то, что я ищу, как they are using form based authentication and I am not.

+1

Что я делаю в проектах, это создание таблицы «Сеансы», в которой я добавляю идентификатор пользователя loggedin с уникальным сгенерированным «SessionId». Тогда вы можете проверить, что пользователь зарегистрировался или нет. – Mivaweb

+0

. Пожалуйста, просмотрите этот вопрос о сохранении сеанса пользователя http: // stackoverflow.com/questions/15199415/how-to-create-session-in-asp-net-c-sharp-login-and-registration-memberprofile-p – immirza

+0

@utility мой вопрос не относится к аутентификации формы – Arti

ответ

0

Это, как мне удалось это сделать с помощью link предоставленной @Satinder singh.

Global.asax.cs

protected void Application_Start(object sender, EventArgs e) 
    { 
     Application["UsersLoggedIn"] = new System.Collections.Generic.List<string>(); 
    } 

    protected void Session_End(object sender, EventArgs e) 
    { 
     // NOTE: you might want to call this from the .Logout() method - aswell -, to speed things up 
     string userLoggedIn = Session["UserLoggedIn"] == null ? string.Empty : (string)Session["UserLoggedIn"]; 
     if (userLoggedIn.Length > 0) 
     { 
      System.Collections.Generic.List<string> d = Application["UsersLoggedIn"] 
       as System.Collections.Generic.List<string>; 
      if (d != null) 
      { 
       lock (d) 
       { 
        d.Remove(userLoggedIn); 
       } 
      } 
     } 
    } 

Login.aspx.cs

protected bool Login(string userId) 
    { 
     System.Collections.Generic.List<string> d = Application["UsersLoggedIn"] 
      as System.Collections.Generic.List<string>; 
     if (d != null) 
     { 
      lock (d) 
      { 
       if (d.Contains(userId)) 
       { 
        // User is already logged in!!! 
        string userLoggedIn = Session["UserLoggedIn"] == null ? string.Empty : (string)Session["UserLoggedIn"]; 
        if (userLoggedIn == user_id) 
        { 
         Session["UserLoggedIn"] = user_id; 
         return true; 
        } 
        else 
        { 
         return false; 
        } 
       } 
       else 
       { 
        string userLoggedIn = Session["UserLoggedIn"] == null ? string.Empty : (string)Session["UserLoggedIn"]; 

        if (userLoggedIn != user_id) 
        { 
         d.Add(userId); 
        } 
       } 
      } 
     } 
     Session["UserLoggedIn"] = userId; 
     return true; 
    } 

С выше коде, я позволяю любому пользователю войти в систему, в любой момент времени только один раз , Я использовал переменную сеанса, чтобы проверить, является ли запрос одним и тем же браузером, если да, я разрешаю ему/ей входить в систему еще раз, бросая сообщение «Вы уже вошли в систему из другой системы».

1

Вы можете добавить столбец в userTable, например IsLoggedIn. во время входа в систему вы можете изменить значение true и на событие Session_End на global.asax изменить его на false

+0

Запускает ли Session_End, даже когда пользователь закрывает браузер? – Arti

+0

Когда пользователь закрывает браузер, сеанс не истекает буквально в течение 20 минут по умолчанию. По окончании сеанса происходит событие Session_End. –

0

Не пытайтесь решить такие проблемы, сохраняя значения в datatbase, вместо этого отправляйтесь на сеанс. Вид подхода.

На странице входа в систему или страницы по умолчанию принять пользователю, сохраненную при помощи сеанса (т.е. Session [ «Имя пользователя»] = «Некоторые вошли в систему пользователя»)

Теперь при загрузке каждой проверки менеджер страницы срок действия сессии, как показано ниже

if(!mCheckStatusOfSession()) 
{ 
Response.Redirect("To Login Page") 
} 

protected void mCheckStatusOfSession{ 
       if (Application[Session["UserName"].ToString()] == null) 
       { 
        return false; 
       } 
       else 
       { 
       Application[Session["UserName"].ToString()].ToString(); 
        if (strID == Session.SessionID.ToString()) 
        { 
         return true; 
        } 
        else 
        { 
         return false; 
        } 
       } 
} 
0

1) входа пользователя в систему, мы проверяем кэш используя имя пользователя + пароль в качестве ключа для кэша пункта. Если элемент Cache существует, мы знаем, что логин уже используется, поэтому мы вышвырнули его. В противном случае мы завершаем аутентификацию (базу данных и т. Д.) И впускаем их.

2) После того, как мы впустили их, мы установили новую запись элемента Cache с ключом, состоящим из имени пользователя + пароля, к текущему значению таймаута сеанса. Мы также можем установить новую переменную сеанса Session ["user"] со значением имени пользователя + пароль, чтобы мы могли выполнять непрерывную проверку запросов на страницу и обновление кеша при каждом запросе страницы во время сеанса пользователя. Это дает нам инфраструктуру для «дублирования» отсутствующих функций Session_End.

3) Теперь нам нужен способ обновления срока действия кеша при каждом запросе страницы.Вы можете сделать это очень элегантно в обработчике Application_PreRequestHandlerExecute в Global, потому что объект Session доступен и «живет» в этом обработчике. Кроме того, это событие запускается при каждом запросе страницы, поэтому нам не нужно помещать одну строку дополнительного кода на любую из наших страниц. Мы используем значение Session ["user"], чтобы получить ключ этого пользователя для извлечения их элемента Cache, таким образом, сбросив его и автоматически установив скользящее окончание до нового значения таймаута. Всякий раз, когда вы получаете доступ к элементу Cache, его свойство SlidingExpiration (если оно правильно настроено) автоматически обновляется. Когда пользователь отказывается от своего сеанса и никаких страниц не запрашивается в течение определенного периода времени, SlidingExpiration их элемента Cache в конечном итоге истекает, и элемент автоматически удаляется из кэша, тем самым позволяя кому-то с тем же именем пользователя и паролем снова войти в систему. Нет суеты, не мусс! Работает с режимами InProc, StateServer и SQL Server!

статейки: 1, 2, 3

0

Чтобы дать более подробную информацию о моем комментарии:

Шаг 1

Создать Sessions таблицу, содержащую следующие поля:

SessionId (Primary Key)      char(24) 
UserId (Foreign Key to Users table)   int 
LoginDate          datetime 

Этап 2

Создайте свой Session класс.

public class Session { 
    public string Sessionid { get; set; } 
    public int UserId { get; set; } 
    public DateTime LoginDate { get; set; } 
} 

Шаг 3

Если у вас есть функция, называемая DoLogin.

public void DoLogin() { 
    //validation commes here... 

    //create your session 
    Session["User"] = user; //user is your User class object 

    //create session class for db 
    Session session = new Session(); 
    session.SessionId = ""; //you can generate here a 24 character string 
    session.UserId = user.Id; 
    session.LoginDate = DateTime.Now; 

    db.Add(session); //add session to db 
} 

Шаг 4

Создайте функцию, чтобы проверить, если пользователь уже LoggedIn.

public bool IsLoggedIn(User user) { 
    Session session = db.GetSession(user.Id); //Get session of the user 

    if(session != null) 
    { 
     return true; 
    } else { 
     return false; 
    } 
} 
+0

Когда я удаляю сеанс таблицы? – Arti

+0

Что вы имеете в виду? вам сначала нужно создать таблицу в своей базе данных, чтобы добавить к ней сеансы – Mivaweb

+0

Да, я получил это. Если я добавлю запись в таблицу сеансов, когда пользователь входит в систему в первый раз, эта конкретная запись должна либо обновляться, либо удаляться, когда пользователь выходит из приложения, а также когда пользователь закрывает браузер. Итак, как мне это сделать? И когда (какое событие) справится с этим? – Arti

Смежные вопросы