public UserModel Login(LoginModel loginModel, HttpContext httpContext) { double minutes = 2d; loginModel.Email = loginModel.Email.ToLower(); DateTime now = DateTime.UtcNow; var ipAddress = httpContext.Connection.RemoteIpAddress; var userAgent = httpContext.Request.Headers["User-Agent"]; var user = usersRepository.Get(x => x.Email == loginModel.Email && string.IsNullOrEmpty(x.ValidationToken)).SingleOrDefault(); if (user != null) { bool verified = PasswordHasher.VerifyPassword(loginModel.Password, user.PasswordSalt, user.Password); if (verified) { var refreshToken = tokensManager.GetRefreshTokenByEmail(loginModel.Email, userAgent); if (refreshToken != null && refreshToken.IpAddress != ipAddress.ToString()) { // TODO Send notification to the user and the admin => May be Hacker attck. } if (refreshToken != null) { refreshToken = tokensManager.UpdateToken(refreshToken.RefreshToken, userAgent); } else { refreshToken = tokensManager.AddToken(loginModel.Email, ipAddress.ToString(), userAgent); } string newToken = GenerateToken(userAgent, user, now, minutes); user.RefreshToken = refreshToken.RefreshToken; user.TokenExpireTimes = now.AddMinutes(minutes); user.Token = newToken; return(user.WithoutPassword()); } else { // TODO BG: LOG login failed email; address ip and user agent. } } return(null); }
/// <summary> /// Вход в систему /// </summary> /// <param name="loginModel">Данные о пользователя</param> /// <param name="httpContext">Контекст HTTP</param> /// <returns>Данные о пользователе или null, при неудачном входе в систему</returns> public UserModel Login(LoginModel loginModel, HttpContext httpContext) { double minutes = 2d; // Две минуты // Преобразуем адрес электронной почтвы пользовате в строчные буквы loginModel.Email = loginModel.Email.ToLower(); DateTime now = DateTime.UtcNow; // Текущие дата и время // Извлекаем IP адрес из контекста HTTP var ipAddress = httpContext.Connection.RemoteIpAddress; // Извоекаем агента пользователя из контекста HTTP var userAgent = httpContext.Request.Headers["User-Agent"]; // Выбираем из хранилища данных о пользователепо адресу электронной почты // и пустому жетону проверки var user = usersRepository.Get(x => x.Email == loginModel.Email && !string.IsNullOrEmpty(x.ValidationToken)) .SingleOrDefault(); if (user != null) // Если пользователь найден { // Проверяем пароль пользователя bool verified = PasswordHasher.VerifyPassword(loginModel.Password, user.PasswordSalt, user.Password); if (verified) // Если пароль совпал { // Получаем жетон обновления по адресу электронной почты пользователя var refreshToken = tokensManager.GetRefreshTokenByEmail(loginModel.Email, userAgent); // Проверка на хакерскую атаку или сбой // Если жетон обновления существует и IP адреса при получении жетона обновления и текущий совпадают if (refreshToken != null && refreshToken.IpAddress != ipAddress.ToString()) { // TODO Send notification to the user and the admin => May be Hacker attck. } if (refreshToken != null) // Если жетон существует { // Получаем обновлённый жетон обновления refreshToken = tokensManager.UpdateToken(refreshToken.RefreshToken, userAgent); } else // Если жетон отсутствует { // Получаем добавленный новый жетон обновления refreshToken = tokensManager.AddToken(loginModel.Email, ipAddress.ToString(), userAgent); } // Генерируем жетон доступа string newToken = GenerateToken(userAgent, user, now, minutes); // Задаём в данных о пользователе жетон обновления user.RefreshToken = refreshToken.RefreshToken; // Задаём время истечения срока действия жетона user.TokenExpireTimes = now.AddMinutes(minutes); // Задаём жетон доступа user.Token = newToken; // Возвращаем данные о пользователе с очищенным паролем return(user.WithoutPassword()); } else // Если пароль не совпал { // TODO BG: LOG login failed email; address ip and user agent. } } return(null); // Возвращаем null при несовпадении паролей или отсутствии пользователя }