Esempio n. 1
0
 private async Task CreateSessionAsync(Guid sessionId, User user,
                                       string ipAddress = null, string userAgent = null)
 {
     var session = new UserSession(sessionId, user.UserId,
                                   _encrypter.GetRandomSecureKey(), ipAddress, userAgent);
     await _userSessionRepository.AddAsync(session);
 }
Esempio n. 2
0
        public async Task <Result <SignInResult> > Handle(SignInCommand request, CancellationToken cancellationToken)
        {
            try
            {
                var checkPassword = await _userService.CheckPasswordAsync(request.UserName, request.Password);

                if (!checkPassword.Succeeded)
                {
                    Error error;

                    if (checkPassword.Errors != null && checkPassword.Errors.Any())
                    {
                        var identityError = checkPassword.Errors.First();
                        error = new Error(identityError.Code, identityError.Description);
                    }
                    else
                    {
                        error = Error.Default();
                    }

                    return(Result <SignInResult> .Fail(error));
                }

                var authTime = DateTime.Now;

                var claims = _jwtService.GetJwtClaims(request.UserName, authTime).ToList();
                var jwt    = _jwtService.GenerateJsonWebToken(claims);

                var userSession = new UserSession(jwt.AccessToken, jwt.RefreshToken, request.UserName)
                {
                    AccessTokenExpiresAt  = _jwtService.GetAccessTokenExpirationTime(),
                    RefreshTokenExpiresAt = _jwtService.GetRefreshTokenExpirationTime()
                };
                await _userSessionRepository.AddAsync(userSession);

                return(Result <SignInResult> .Success(new SignInResult(jwt.AccessToken, jwt.RefreshToken)));
            }
            catch (Exception e)
            {
                _logger.LogError(e, e.Message);

                return(Result <SignInResult> .Fail(Error.Default()));
            }
        }
        public async Task <TokenModel> SignInAsync(LoginModel loginModel)
        {
            _serviceLogger.Info("User Login {$loginModel}", loginModel.ToJson());
            var user = await _userManager.FindByNameAsync(loginModel.Username);

            if (user != null)
            {
                var validationResult = await _signInManager.PasswordSignInAsync(user, loginModel.Password, false, true);

                if (validationResult.Succeeded)
                {
                    var userClaims = await _userManager.GetClaimsAsync(user);

                    var token = SignedToken(userClaims);

                    // Create UserSession
                    var userSession = new UserSession
                    {
                        Id = DataUtil.GenerateUniqueId(),
                        RequestIpAddress = loginModel.ClientIp,
                        SoftwareAgent    = loginModel.SoftwareAgent,
                        InstalledVersion = loginModel.VersionInstalled,
                        SignInDate       = DateTime.UtcNow,
                        UserId           = user.Id,
                        Username         = user.Username,
                        UserActivities   = new List <UserActivity>
                        {
                            new UserActivity
                            {
                                Id           = DataUtil.GenerateUniqueId(),
                                ActivityName = "USER_SIGNIN",
                                Content      = "Signin successfully",
                                ActivityDate = DateTime.UtcNow,
                                ActivityType = ActivityType.Info
                            }
                        }
                    };
                    await _userSessionRepository.AddAsync(userSession);

                    // Create refresh token
                    var expToken        = DateTime.UtcNow.AddMinutes(_jwtBearerOptions.CurrentValue.TokenExpiration);
                    var expRefreshToken = DateTime.UtcNow.AddMinutes(_jwtBearerOptions.CurrentValue.RefreshTokenExpiration);
                    var issuedToken     = new IssuedToken
                    {
                        Id                  = DataUtil.GenerateUniqueId(),
                        UserId              = user.Id,
                        JwtToken            = token,
                        ExpiredJwtToken     = expToken,
                        ExpiredRefreshToken = expRefreshToken,
                        RefreshToken        = CryptoUtil.ToSHA256(Guid.NewGuid().ToString()),
                        UserSessionId       = userSession.Id,
                        Deactive            = false
                    };

                    await _issuedTokenRepository.AddAsync(issuedToken);

                    _serviceLogger.Info("User Login Successfully {$issuedToken}", issuedToken.ToJson());
                    return(new TokenModel
                    {
                        Token = token,
                        Exp = ((DateTimeOffset)expToken).ToUnixTimeSeconds(),
                        ExpRefresh = ((DateTimeOffset)expRefreshToken).ToUnixTimeSeconds(),
                        RefreshToken = issuedToken.RefreshToken,
                        UserSessionId = userSession.Id
                    });
                }
            }

            throw new IdentityException(ErrorCodes.CannotSignIn);
        }