как предотвратить повторный вход пользователя - PullRequest
3 голосов
/ 19 апреля 2011

В моем приложении я не хочу, чтобы два пользователя входили под одним и тем же именем.

Например, user1 входит в систему с именем «test1», затем user2 пытается также войти в систему с «test1», но в этот момент формат аутентификации user1 не истекает, поэтому в регистрации user2 должно быть отказано.

Я создал класс кэша для записи всего активного сеанса:

public class SessionDb {
    private static Dictionary<string, HttpSessionState> sessionDB=new Dictionary<string, HttpSessionState>();
public SessionDb() {
}

public static void addUserAndSession(string name, HttpSessionState session) {
    sessionDB.Add(name, session);
}

public static bool containUser(string name) {
    //in fact,here I also want to check if this session is active or not ,but I do not find the method like session.isActive() or session.HasExpire() or something else.
    return sessionDB.ContainsKey(name);
}

public static void removeUser(string name) {
    if(sessionDB.ContainsKey(name)) {
        sessionDB.Remove(name);
    }
}

}

В логине.aspx.cs:

// проверить имя и пароль

if(checkNameAndPass(sUserName, sUserPwd)) {
    if(!SessionDb.containUser(sUserName)) {
        //let the user login
        Session["current_user_name"] = sUserName;
        SessionDb.addUserAndSession(sUserName, Session);
        FormsAuthentication.RedirectFromLoginPage(UserName.Text, false);
    }
    else {
        //
        this.error.Text=string.Format("user {0} have logined!", sUserName);
    }
}

Global.asax:

void Session_End(object sender, EventArgs e) 
{
    SessionDb.removeUser(Session["current_user_name"].ToString());
}

Но, похоже, что метод Session_End () вызывается в какое-то время в соответствии с настройкой тайм-аута в sessionState.

Очевидно, мне нужно, чтобы SessionDb удалял связанный сеанс по истечении времени ожидания аутентификации.

Есть идеи по улучшению моего кода? или любая другая идея для реализации моего требования?

Я просто не хочу повторного входа пользователя (с тем же именем).

UPDATE:

Кстати, я думаю, что в моем коде также есть некоторые проблемы: я сохраняю токен входа в систему с помощью сеанса, но как насчет того, что для formauthentication истекло время ожидания, а для сеанса нет?

Ответы [ 2 ]

3 голосов
/ 19 апреля 2011

Если вы используете поставщика членства:

Пользователь считается подключенным к сети, если текущая дата и время минус значение свойства UserIsOnlineTimeWindow раньше, чем LastActivityDate для пользователя.

из MSDN Article

, поэтому вы можете просто использовать проверку

Membership.IsOnline();

перед тем, как войти в систему пользователя.

0 голосов
/ 19 апреля 2011

На сайте asp.net как предотвратить несколько входов в систему с одним и тем же идентификатором пользователя?
Другой подход (Отказ от ответственности: я не проверял это.):

В Интернете.config добавляет userIsOnlineTimeWindow в 1 и в обработчике события loggingIn:

protected void Login1_LoggingIn(object sender, LoginCancelEventArgs e)
{
  MembershipUser u = Membership.GetUser(Login1.UserName);
  Response.Write(u.IsOnline);
  if (u.IsOnline)
  {
    Login1.FailureText = "A user with this username is already logged in.";
    e.Cancel = true;
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...