예제 #1
0
        public IActionResult Refresh([FromBody] RefreshTokenModelDto refreshTokenModelDto)
        {
            var refreshTokenResultDto = new RefreshTokenResultDto();

            if (string.IsNullOrEmpty(refreshTokenModelDto.Token) || string.IsNullOrEmpty(refreshTokenModelDto.RefreshToken)) // Make sure they have a refresh token
            {
                refreshTokenResultDto.WasSuccessful = false;
                return(Ok(refreshTokenResultDto));
            }

            string loginProvier = "providername";

            var savedRefreshToken = _authenticationService.GetRefreshTokenByToken(loginProvier, "refresh", refreshTokenModelDto.RefreshToken, "phone"); // Retrieve the refresh token  fromt he database AspNetToken table

            if (savedRefreshToken == null || savedRefreshToken.Value != refreshTokenModelDto.RefreshToken)                                              // If there's no matching refresh token in the database we have a problem
            {
                refreshTokenResultDto.WasSuccessful = false;
                return(Ok(refreshTokenResultDto));
            }

            var newJwtToken     = _authenticationService.GenerateAuthToken(savedRefreshToken.UserId, _appSettings.Secret);       // The refresh token looks good, so let's generate a new auth token
            var newRefreshToken = _authenticationService.GenerateRefreshToken();                                                 // Generate a new reresh token as well

            _authenticationService.RemoveRefreshToken(loginProvier, "refresh", refreshTokenModelDto.RefreshToken, "phone");      // Remove any existing refresh tokens
            _authenticationService.AddRefreshToken(savedRefreshToken.UserId, loginProvier, "refresh", newRefreshToken, "phone"); // Add the new refresh token

            refreshTokenResultDto.Token         = newJwtToken;
            refreshTokenResultDto.RefreshToken  = newRefreshToken;
            refreshTokenResultDto.WasSuccessful = true;

            return(Ok(refreshTokenResultDto));
        }
예제 #2
0
        public async Task <IActionResult> Refresh([FromBody] RefreshTokenModelDto dto)
        {
            IActionResult response = Unauthorized();

            if (string.IsNullOrWhiteSpace(dto.Token) || string.IsNullOrWhiteSpace(dto.RefreshToken))
            {
                return(response);
            }

            var emailFormRefreshToken = await _authSvc.GetEmailByRefreshTokenAsync(dto.RefreshToken);

            if (string.IsNullOrWhiteSpace(emailFormRefreshToken))
            {
                return(response);
            }

            await _authSvc.DeleteRefreshTokenAsync(dto.RefreshToken);

            var principal         = _authSvc.GetPrincipalFromExpiredToken(dto.Token);
            var emailFormJwtToken = principal.Claims.FirstOrDefault(c => c.Type == "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress")?.Value;

            if (string.IsNullOrWhiteSpace(emailFormJwtToken))
            {
                return(response);
            }

            if (emailFormJwtToken != emailFormRefreshToken)
            {
                return(response);
            }

            var user = await _authSvc.FindUserAsync(emailFormJwtToken);

            if (user == null)
            {
                return(response);
            }

            var userDto = _mapper.Map <UserModelDto>(user);

            userDto.Token        = _authSvc.BuildJwtToken(user);
            userDto.RefreshToken = _authSvc.BuildRefreshToken();

            await _authSvc.AddRefreshTokenAsync(userDto.RefreshToken, userDto.Email);

            response = Ok(userDto);

            return(response);
        }