В моем приложении я не хочу, чтобы два пользователя входили под одним и тем же именем.
Например, 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 истекло время ожидания, а для сеанса нет?