diff --git a/src/Application/Common/Interfaces/Identity/IIdentityService.cs b/src/Application/Common/Interfaces/Identity/IIdentityService.cs index f2b6e757b..03fc1bf80 100644 --- a/src/Application/Common/Interfaces/Identity/IIdentityService.cs +++ b/src/Application/Common/Interfaces/Identity/IIdentityService.cs @@ -11,7 +11,7 @@ namespace CleanArchitecture.Blazor.Application.Common.Interfaces.Identity; public interface IIdentityService : IService { Task> LoginAsync(TokenRequest request, CancellationToken cancellation = default); - Task GenerateJwtAsync(ApplicationUser user); + Task GenerateJwtAsync(ApplicationUser user, bool rememberMe = false); Task> RefreshTokenAsync(RefreshTokenRequest request, CancellationToken cancellation = default); Task GetClaimsPrincipal(string token); Task GetUserNameAsync(string userId, CancellationToken cancellation = default); diff --git a/src/Infrastructure/Services/Identity/IdentityService.cs b/src/Infrastructure/Services/Identity/IdentityService.cs index 25d8702ec..0485f7b3b 100644 --- a/src/Infrastructure/Services/Identity/IdentityService.cs +++ b/src/Infrastructure/Services/Identity/IdentityService.cs @@ -110,19 +110,10 @@ public async Task> LoginAsync(TokenRequest request, Cancel { return await Result.FailureAsync(new string[] { _localizer["Invalid Credentials."] }); } - user.RefreshToken = GenerateRefreshToken(); - var tokenExpiryTime = DateTime.Now.AddDays(7); - - if (request.RememberMe) - { - tokenExpiryTime = DateTime.Now.AddYears(1); - } - user.RefreshTokenExpiryTime = tokenExpiryTime; - await _userManager.UpdateAsync(user); - var token = await GenerateJwtAsync(user); - var response = new TokenResponse { Token = token, RefreshTokenExpiryTime = tokenExpiryTime, RefreshToken = user.RefreshToken, ProfilePictureDataUrl = user.ProfilePictureDataUrl }; - return await Result.SuccessAsync(response); + + var token = await GenerateJwtAsync(user,request.RememberMe); + return await Result.SuccessAsync(token); } public async Task> RefreshTokenAsync(RefreshTokenRequest request, CancellationToken cancellation = default) @@ -173,11 +164,19 @@ private string GenerateRefreshToken() rng.GetBytes(randomNumber); return Convert.ToBase64String(randomNumber); } - public async Task GenerateJwtAsync(ApplicationUser user) + public async Task GenerateJwtAsync(ApplicationUser user,bool rememberMe=false) { + user.RefreshToken = GenerateRefreshToken(); var principal = await _userClaimsPrincipalFactory.CreateAsync(user); + var tokenExpiryTime = DateTime.Now.AddDays(7); + if (rememberMe) + { + tokenExpiryTime = DateTime.Now.AddYears(1); + } + user.RefreshTokenExpiryTime = tokenExpiryTime; + await _userManager.UpdateAsync(user); var token = GenerateEncryptedToken(GetSigningCredentials(), principal.Claims); - return token; + return new TokenResponse { Token = token, RefreshTokenExpiryTime = tokenExpiryTime, RefreshToken = user.RefreshToken, ProfilePictureDataUrl = user.ProfilePictureDataUrl }; } private string GenerateEncryptedToken(SigningCredentials signingCredentials, IEnumerable claims) { diff --git a/src/Infrastructure/Services/JWT/AccessTokenProvider.cs b/src/Infrastructure/Services/JWT/AccessTokenProvider.cs index 754004560..23160653d 100644 --- a/src/Infrastructure/Services/JWT/AccessTokenProvider.cs +++ b/src/Infrastructure/Services/JWT/AccessTokenProvider.cs @@ -31,8 +31,8 @@ public AccessTokenProvider(ProtectedLocalStorage localStorage, NavigationManager public async Task GenerateJwt(ApplicationUser applicationUser) { var token = await _identityService.GenerateJwtAsync(applicationUser,true); - await _localStorage.SetAsync(_tokenKey, token.Token); - await _localStorage.SetAsync(_refreshTokenKey, token.RefreshToken); + await _localStorage.SetAsync(_tokenKey, token.Token??""); + await _localStorage.SetAsync(_refreshTokenKey, token.RefreshToken??""); _tenantProvider.TenantId = applicationUser.TenantId; _tenantProvider.TenantName = applicationUser.TenantName; _currentUser.UserId = applicationUser.Id;