@@ -276,30 +276,24 @@ public async Task<IActionResult> Login([FromBody] LoginRequest loginRequest) {
276276
277277 var roles = await this . _signInManager . UserManager . GetRolesAsync ( user ) ;
278278
279- List < Claim > claims = new List < Claim > ( ) ;
280- claims . Add ( new Claim ( ClaimTypes . Name , user . UserName ) ) ;
281- claims . Add ( new Claim ( ClaimTypes . Email , user . Email ) ) ;
282- claims . Add ( new Claim ( ClaimTypes . NameIdentifier , user . Id ) ) ;
283- claims . Add ( new Claim ( "_Id" , user . _Id != null ? user . _Id : "-" ) ) ;
284- foreach ( var role in roles ) {
285- claims . Add ( new Claim ( ClaimTypes . Role , role ) ) ;
279+ JwtSecurityToken token = this . _authService . CreateJwtToken ( user , roles . ToList ( ) ) ;
280+
281+ if ( token == null ) {
282+ _logger . LogWarning ( "Token creation failed for user: " + loginRequest . Email ) ;
283+ return BadRequest ( ) ;
286284 }
287285
288- var key = new SymmetricSecurityKey ( Encoding . UTF8 . GetBytes ( this . _jwtSettings . SecurityKey ) ) ;
289- var creds = new SigningCredentials ( key , SecurityAlgorithms . HmacSha256 ) ;
290- var expiry = DateTime . Now . AddMinutes ( System . Convert . ToInt32 ( this . _jwtSettings . ExpiresInMinutes ) ) ;
291-
292- var token = new JwtSecurityToken (
293- _jwtSettings . Issuer ,
294- _jwtSettings . Audience ,
295- claims ,
296- expires : expiry ,
297- signingCredentials : creds
298- ) ;
299-
300- response . Token = new JwtSecurityTokenHandler ( ) . WriteToken ( token ) ;
301- response . Expires = expiry ;
302- return Ok ( response ) ;
286+ user . RefreshToken = AuthService . GenerateRefreshToken ( ) ;
287+ user . RefreshTokenExpiryTime = DateTime . UtcNow . AddDays ( this . _jwtSettings . RefreshTokenValidityInDays ) ;
288+ await _userManager . UpdateAsync ( user ) ;
289+
290+ return Ok (
291+ new TokenResponse ( ) {
292+ Token = new JwtSecurityTokenHandler ( ) . WriteToken ( token ) ,
293+ Expires = token . ValidTo ,
294+ RefreshToken = user . RefreshToken ,
295+ RefreshTokenExpiryTime = user . RefreshTokenExpiryTime
296+ } ) ;
303297 }
304298 return BadRequest ( ) ;
305299 }
@@ -310,6 +304,46 @@ public async Task<IActionResult> Login([FromBody] LoginRequest loginRequest) {
310304 }
311305 }
312306
307+ [ HttpPost ]
308+ [ Route ( "refresh-token" ) ]
309+ public async Task < IActionResult > RefreshToken ( RefreshTokenRequest request ) {
310+ try {
311+ var principal = this . _authService . GetPrincipalFromExpiredToken ( request . Token ) ;
312+ if ( principal == null ) {
313+ return BadRequest ( ) ;
314+ }
315+ string username = principal . Identity . Name ;
316+ ApplicationUser user = await _userManager . FindByNameAsync ( username ) ;
317+
318+ if ( user == null || user . RefreshToken != request . RefreshToken || user . RefreshTokenExpiryTime <= DateTime . Now ) {
319+ return BadRequest ( ) ;
320+ }
321+ IList < string > roles = await _signInManager . UserManager . GetRolesAsync ( user ) ;
322+
323+ JwtSecurityToken token = this . _authService . CreateJwtToken ( user , roles . ToList ( ) ) ;
324+
325+ if ( token == null ) {
326+ _logger . LogWarning ( "Token creation failed for user: " + username ) ;
327+ return BadRequest ( ) ;
328+ }
329+
330+ user . RefreshToken = AuthService . GenerateRefreshToken ( ) ;
331+
332+ await _userManager . UpdateAsync ( user ) ;
333+
334+ return Ok ( new TokenResponse ( ) {
335+ Token = new JwtSecurityTokenHandler ( ) . WriteToken ( token ) ,
336+ Expires = token . ValidTo ,
337+ RefreshToken = user . RefreshToken ,
338+ RefreshTokenExpiryTime = user . RefreshTokenExpiryTime
339+ } ) ;
340+ }
341+ catch ( Exception ex ) {
342+ _logger . LogError ( "Refresh token error: " + ex . Message ) ;
343+ return BadRequest ( ) ;
344+ }
345+ }
346+
313347 [ AllowAnonymous ]
314348 [ HttpPost ( "register" ) ]
315349 public async Task < IActionResult > Register ( [ FromBody ] RegisterRequest request ) {
@@ -459,6 +493,28 @@ public async Task<IActionResult> ResetPasswordWithEmail([FromBody] ResetPassword
459493 }
460494 }
461495
496+ [ Authorize ( Roles = "Admin, User" ) ]
497+ [ HttpPost ]
498+ [ Route ( "[action]" ) ]
499+ public async Task < IActionResult > Revoke ( [ FromBody ] RevokeTokenRequest request ) {
500+ try {
501+ ApplicationUser user = await _userManager . FindByNameAsync ( request . UserName ) ;
502+ if ( user == null ) {
503+ return BadRequest ( ) ;
504+ }
505+
506+ user . RefreshToken = null ;
507+ await this . _userManager . UpdateAsync ( user ) ;
508+
509+ return Ok ( ) ;
510+ }
511+ catch ( Exception ex ) {
512+ _logger . LogError ( $ "Revoke token error for user { request . UserName } : " + ex . Message ) ;
513+ return BadRequest ( ) ;
514+ }
515+ }
516+
517+
462518 [ Authorize ( Roles = "Admin, User" ) ]
463519 [ HttpPut ]
464520 public async Task < IActionResult > Update ( [ FromBody ] UpdateUserRequest updateUserRequest ) {
0 commit comments