Example #1
0
        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);
        }
Example #2
0
        /// <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 при несовпадении паролей или отсутствии пользователя
        }