Exemplo n.º 1
0
        public async Task <Token> GetAccessTokenAsync(UserDto user)
        {
            Logger.LogInformation($"{nameof(CommonAuthService)}.{nameof(GetAccessTokenAsync)}.Start");
            if ((user.RoleType != RoleType.Guest || user.UserId != 0) && await Db.Tokens.CountTokensForUserAsync(user.UserId) > 10)
            {
                await Db.Tokens.RemoveTokensByUserIdAsync(user.UserId);

                throw new Exception("You logged in at least 10 different devices. We are forced to save your data. Now you are logged out of all devices. Please log in again.");
            }

            var result = await JwtService.GenerateJwtAsync(user.UserId, user.RoleType);

            var token = new TokenEntity
            {
                UserId       = user.UserId,
                ExpiresIn    = result.ExpiresIn,
                RefreshToken = result.RefreshToken
            };

            if (!await Db.Tokens.AddTokenAsync(token))
            {
                throw new Exception("Can not add token to database. You entered just as a guest.");
            }
            Logger.LogInformation($"{nameof(CommonAuthService)}.{nameof(GetAccessTokenAsync)}.End");
            return(result);
        }
Exemplo n.º 2
0
        public async Task <Token> GetRefreshTokenAsync(string refreshToken)
        {
            Logger.LogInformation($"{nameof(CommonAuthService)}.{nameof(GetRefreshTokenAsync)}.Start");
            var tokenFromClient = new JwtSecurityTokenHandler().ReadJwtToken(refreshToken);

            if (!int.TryParse(
                    tokenFromClient.Claims.FirstOrDefault(x => x.Type == ClaimsIdentity.DefaultNameClaimType)?.Value ?? "-1",
                    out var userId) || userId == -1)
            {
                throw new Exception("We can not find your id.");
            }
            var tokenFromDb = await Db.Tokens.FindTokenByTokenAndUserIdAsync(userId, refreshToken);

            if (tokenFromDb == null)
            {
                if (userId == 0)
                {
                    throw new Exception("We can not find your refresh token. Please, log in again.");
                }
                await Db.Tokens.RemoveTokensByUserIdAsync(userId);

                throw new Exception("We can not find your refresh token. Please, login again We are forced to save your data. Now you are out of all devices. Please log in again.");
            }

            if (!IsValidToken(tokenFromDb.RefreshToken))
            {
                throw new Exception("The refresh token is invalid. Please, login again.");
            }

            var oldTokenFromDb = new JwtSecurityTokenHandler().ReadJwtToken(tokenFromDb.RefreshToken);

            if (DateTime.UtcNow > oldTokenFromDb.ValidTo)
            {
                throw new Exception("The refresh token is invalid. Please, login again.");
            }

            var role = userId == 0 ? RoleType.Guest : await Db.Users.GetUserRoleAsync(userId);

            var result = await JwtService.GenerateJwtAsync(userId, role);

            var token = new TokenEntity
            {
                UserId       = userId,
                ExpiresIn    = result.ExpiresIn,
                RefreshToken = result.RefreshToken
            };

            var isDeleted = await Db.Tokens.RemoveTokenAsync(tokenFromDb.TokenId);

            var isAdded = await Db.Tokens.AddTokenAsync(token);

            if (!isDeleted || !isAdded)
            {
                throw new Exception("Can not add token to database. Please, get access token again or enter like a guest");
            }
            //var p = new JwtSecurityTokenHandler().ReadJwtToken(result.RefreshToken).ValidTo;
            Logger.LogInformation($"{nameof(CommonAuthService)}.{nameof(GetRefreshTokenAsync)}.End");
            return(result);
        }
        public async Task <Token> RegisterAsync(UserRegistrationViewModel user)
        {
            Logger.LogInformation($"{nameof(InternalAuthService)}.{nameof(RegisterAsync)}.Start");
            var isExistByPhone = !user.Phone.IsNullOrEmpty() && await Db.Users.IsUserExistByPhoneAsync(user.Phone);

            var isExistByEmail = !user.Email.IsNullOrEmpty() && await Db.Users.IsUserExistByEmailAsync(user.Email);

            if (isExistByEmail || isExistByPhone)
            {
                throw new Exception("You have already registered.");
            }

            const RoleType role = RoleType.User;

            var userDb = new UserEntity
            {
                Email            = user.Email,
                PhoneNumber      = user.Phone,
                RoleType         = role,
                PasswordHash     = user.Password.GetMd5HashString(),
                RegistrationDate = DateTime.UtcNow,
            };
            var isAdded = await Db.Users.AddUserAsync(userDb);

            if (!isAdded || userDb.UserId == 0)
            {
                throw new Exception("We are not able to add you. Please, tell us about it.");
            }

            string firstName;
            string lastName;

            var spacePosition = user.Login.IndexOf(' ');

            if (spacePosition == -1)
            {
                firstName = user.Login.Substring(0, user.Login.Length);
                lastName  = "";
            }
            else
            {
                firstName = user.Login.Substring(0, spacePosition);
                lastName  = user.Login.Substring(spacePosition + 1).Trim();
            }
            var userInfo = new UserInfoQuery
            {
                UserId            = userDb.UserId,
                FirstName         = firstName,
                LastName          = lastName,
                BirthDate         = user.BirthDate,
                SexType           = user.SexType,
                City              = user.City,
                Description       = user.Description ?? "",
                OriginalAvatarUrl = (await Hub.Media.GetStandardAvatarUrls(AvatarSizeType.Original)).FirstOrDefault() ?? ""
            };

            if (!await Db.UsersInfo.AddUserInfoAsync(userInfo))
            {
                await Db.Users.RemoveUserAsync(userDb.UserId);

                throw new Exception("We are not able to add your information. Please, tell us about it.");
            }

            //await Hub.Monitoring.AddUrlMonitoring(userDb.UserId);

            var jwtToken = await JwtService.GenerateJwtAsync(userDb.UserId, role);

            var token = new TokenEntity
            {
                UserId       = userDb.UserId,
                ExpiresIn    = jwtToken.ExpiresIn,
                RefreshToken = jwtToken.RefreshToken
            };

            // SendConfirmedEmail(userDb.UserId, role, userDb.Email);

            if (!await Db.Tokens.AddTokenAsync(token))
            {
                throw new Exception("Can not add token to database. You entered just as a guest.");
            }
            Logger.LogInformation($"{nameof(InternalAuthService)}.{nameof(RegisterAsync)}.End");
            return(jwtToken);
        }