Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 39 additions & 17 deletions src/Infrastructure/Identity/IdentityService.cs
Original file line numberDiff line numberDiff line change
Expand Up@@ -148,10 +148,19 @@ public async Task<AuthenticationResult> RefreshTokenAsync(string token, string r
throw new AuthenticationException("This refresh token does not match this Jwt.");
}

_context.RefreshTokens.Remove(storedRefreshToken);
var jweToken = CreateJweToken(user);

storedRefreshToken.JwtId = jweToken.Id;
storedRefreshToken.ExpiryDateTime =
LocalDateTime.FromDateTime(DateTime.UtcNow.AddDays(_jweSettings.RefreshTokenLifetimeInDays));
_context.RefreshTokens.Update(storedRefreshToken);
await _context.SaveChangesAsync();

return await GenerateAuthenticationResultForUserAsync(user);
return new AuthenticationResult()
{
Token = jweToken,
RefreshToken = _mapper.Map<RefreshTokenDto>(storedRefreshToken)
};
}

private ClaimsPrincipal? GetPrincipalFromToken(string token)
Expand DownExpand Up@@ -196,6 +205,11 @@ public async Task<AuthenticationResult> RefreshTokenAsync(string token, string r
throw new AuthenticationException("Username or password is invalid.");
}

var existedRefreshTokens = _context.RefreshTokens.Where(x => x.User.Email!.Equals(user.Email));

_context.RemoveRange(existedRefreshTokens);
await _context.SaveChangesAsync();

return (await GenerateAuthenticationResultForUserAsync(user), _mapper.Map<UserDto>(user));
}

Expand DownExpand Up@@ -226,6 +240,28 @@ public async Task<bool> LogoutAsync(string token, string refreshToken)
}

private async Task<AuthenticationResult> GenerateAuthenticationResultForUserAsync(User user)
{
var token = CreateJweToken(user);
var utcNow = DateTime.UtcNow;

var refreshToken = new RefreshToken()
{
JwtId = token.Id,
User = user,
CreationDateTime = LocalDateTime.FromDateTime(utcNow),
ExpiryDateTime = LocalDateTime.FromDateTime(utcNow.AddDays(_jweSettings.RefreshTokenLifetimeInDays))
};

await _context.RefreshTokens.AddAsync(refreshToken);
await _context.SaveChangesAsync();
return new()
{
Token = token,
RefreshToken = _mapper.Map<RefreshTokenDto>(refreshToken)
};
}

private SecurityToken CreateJweToken(User user)
{
var utcNow = DateTime.UtcNow;
var authClaims = new List<Claim>
Expand All@@ -252,20 +288,6 @@ private async Task<AuthenticationResult> GenerateAuthenticationResultForUserAsyn

var token = handler.CreateToken(tokenDescriptor);

var refreshToken = new RefreshToken()
{
JwtId = token.Id,
User = user,
CreationDateTime = LocalDateTime.FromDateTime(utcNow),
ExpiryDateTime = LocalDateTime.FromDateTime(utcNow.AddDays(_jweSettings.RefreshTokenLifetimeInDays))
};

await _context.RefreshTokens.AddAsync(refreshToken);
await _context.SaveChangesAsync();
return new()
{
Token = token,
RefreshToken = _mapper.Map<RefreshTokenDto>(refreshToken)
};
return token;
}
}