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)); }
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); }