Example #1
0
        public LoginResponse AuthenticateClient(LoginRequest request)
        {
            var client = GetClientByLogin(request.Login);

            if (client == null)
            {
                throw new Exception("Client with login " + request.Login + " DOESNT EXIST");
            }

            string hashedPassword  = GetHashedPassword(client.IdClient);
            string salt            = GetSalt(client.IdClient);
            bool   isPasswordValid = ValidationHelper.IsPasswordValid(request.Password, hashedPassword, salt);

            if (!isPasswordValid)
            {
                throw new Exception("Incorrect password for client with login " + request.Login);
            }

            var accessToken  = TokensGenerator.GenerateAccessToken(client.IdClient, _configuration);
            var refreshToken = TokensGenerator.GenerateRefreshToken(client.IdClient, accessToken);

            var updatedAccessToken  = UpdateAccessToken(accessToken);
            var updatedRefreshToken = UpdateRefreshToken(refreshToken);

            return(new LoginResponse
            {
                AccessToken = updatedAccessToken,
                RefreshToken = updatedRefreshToken
            });
        }
Example #2
0
        public NewClientResponse AddNewClient(NewClientRequest request)
        {
            if (LoginExists(request.Login))
            {
                throw new Exception("User with login " + request.Login + " already exists");
            }

            var clientId       = GenerateNewClientId();
            var hashSalt       = HashSaltGenerator.GenerateSaltedHash(request.Password);
            var hashedPassword = hashSalt.Hash;
            var salt           = hashSalt.Salt;
            var accessToken    = TokensGenerator.GenerateAccessToken(clientId, _configuration);
            var refreshToken   = TokensGenerator.GenerateRefreshToken(clientId, accessToken);

            SaveClient(request, clientId, hashedPassword, salt);
            var refreshId = GetNewRefreshTokenId();
            var accessId  = GetNewAccessTokenId();

            SaveAccessToken(accessToken, clientId, accessId);
            SaveRefreshToken(refreshToken, clientId, refreshId);
            AssignTokensToClient(clientId, accessToken, refreshToken);

            return(new NewClientResponse
            {
                AccessToken = accessToken.Token,
                RefreshToken = refreshToken.Token
            });
        }
Example #3
0
        public async Task <IActionResult> LoginUser(UserLoginForm loginForm)
        {
            var user = await _userManager.FindByNameAsync(loginForm.UserName);

            var result = await _signInManager.CheckPasswordSignInAsync(user, loginForm.Password, false);

            if (result.Succeeded)
            {
                var appUser = await _userManager.Users.FirstOrDefaultAsync(
                    u => u.NormalizedUserName == loginForm.UserName.ToUpper());

                var roles = await _userManager.GetRolesAsync(appUser);

                var userProfile = _mapper.Map <UserProfileDto>(appUser);

                var tokenKey = _securityConfigurations.tokenKey;
                var issuer   = _securityConfigurations.Issuer;
                var appKey   = _securityConfigurations.appKey;

                var token        = TokensGenerator.GenerateJwtToken(appUser, roles, tokenKey, issuer);
                var refreshToken = TokensGenerator.GenerateRefreshToken();

                HttpContext.AddCookies(token, appKey);
                HttpContext.AddCookies(refreshToken, $"{appKey}Refresh");

                var existingToken = await _tokenRepository.FindItemAsync(
                    t => t.UserId == appUser.Id &&
                    t.DeviceName == Request.Headers["device-info"].ToString());

                if (existingToken != null)
                {
                    _logger.LogWarning($"User with Id {appUser.Id} has already logged in from this device, old refresh token will be removed.");

                    await _tokenRepository.RemoveItemAsync(existingToken);

                    _logger.LogInformation($"Old refresh token for user with Id {appUser.Id} removed from database.");
                }

                await _tokenRepository.AddItemAsync(
                    new RefreshToken
                {
                    Id         = GuidCreator.CreateGuid(),
                    TokenValue = refreshToken,
                    DeviceName = Request.Headers["device-info"],
                    UserId     = appUser.Id
                });

                _logger.LogInformation($"User with id {appUser.Id} successfully logged in.");

                return(Ok(new { user = userProfile, token, refreshToken }));
            }

            return(Unauthorized());
        }
Example #4
0
        public RefreshTokenResponse RefreshToken(RefreshTokenRequest request)
        {
            var client = GetUserByRefreshToken(request.RefreshToken);

            var accessToken        = TokensGenerator.GenerateAccessToken(client.IdClient, _configuration);
            var updatedAccessToken = UpdateAccessToken(accessToken);

            var refreshToken        = TokensGenerator.GenerateRefreshToken(client.IdClient, accessToken);
            var updatedRefreshToken = UpdateRefreshToken(refreshToken);

            return(new RefreshTokenResponse
            {
                AccessToken = updatedAccessToken,
                RefreshToken = updatedRefreshToken
            });
        }
Example #5
0
        public async Task <IActionResult> RefreshToken([FromHeader] string RefreshToken)
        {
            var refreshToken = await _tokenRepository.FindItemAsync(
                t => t.TokenValue == RefreshToken);

            if (refreshToken != null)
            {
                await _tokenRepository.RemoveItemAsync(refreshToken);

                refreshToken.TokenValue = TokensGenerator.GenerateRefreshToken();
                await _tokenRepository.AddItemAsync(refreshToken);

                var user = await _userManager.FindByIdAsync(refreshToken.UserId.ToString());

                var roles = await _userManager.GetRolesAsync(user);

                var userProfile = _mapper.Map <UserProfileDto>(user);

                var tokenKey = _securityConfigurations.tokenKey;
                var issuer   = _securityConfigurations.Issuer;
                var appKey   = _securityConfigurations.appKey;

                var token = TokensGenerator.GenerateJwtToken(user, roles, tokenKey, issuer);

                HttpContext.AddCookies(token, appKey);
                HttpContext.AddCookies(refreshToken.TokenValue, $"{appKey}Refresh");

                _logger.LogInformation($"Token for user {refreshToken.UserId} successfully refreshed.");

                return(Ok(new { user = userProfile, token, refreshToken.TokenValue }));
            }

            _logger.LogError($"Token {RefreshToken} doesn't exist in database.!");

            return(StatusCode(401));
        }