public async Task <bool> forgotPasswordAsync(string email, string securityQuestion, string securityQuestionReply)
        {
            var myuser = await _context.Users.FirstOrDefaultAsync(x => x.Email == email);

            if (myuser == null)
            {
                throw new KeyNotFoundException();
            }
            else
            {
                if (myuser.SecurityQuestion.Equals(securityQuestion) &&
                    myuser.SecurityQuestionAnswer.Equals(securityQuestionReply))
                {
                    if (myuser.IsEmailVerified ?? false)
                    {
                        var tempPassword = Authentication.generateTempPassord();
                        myuser.PasswordHash        = Authentication.generateUserHash(tempPassword);
                        myuser.IsTemporaryPassword = true;
                        EmailOperations.sendPasswordChangeEmailAsync(tempPassword, myuser.Name, myuser.Email);
                        _context.Update(myuser);
                        await _context.SaveChangesAsync();

                        return(true);
                    }
                    else
                    {
                        var token = Authentication.generateEmailTokenHash();
                        myuser.VerificationToken       = token;
                        myuser.VerificationTokenExpiry = DateTime.UtcNow.AddDays(1);
                        EmailOperations.sendVerificationEmailAsync(myuser.Name, myuser.Email, token);
                    }
                }
                return(false);
            }
        }
        public async void RegisterUser(UserModel User)
        {
            string token = null;

            while (token == null || _context.Users.Any(u => u.VerificationToken == token))
            {
                token = Authentication.generateEmailTokenHash();
            }

            EmailOperations.sendVerificationEmailAsync(User.Name, User.Email, token);

            User.PasswordHash = Authentication.generateUserHash(User.PasswordHash);
            var now = DateTime.UtcNow;

            User.IsEmailVerified         = false;
            User.VerificationToken       = token;
            User.VerificationTokenExpiry = now.AddHours(24);
            User.IsTemporaryPassword     = false;
            _context.AddAsync(User);
            _context.SaveChanges();
        }
        public string Login(UserModel Userinfo)
        {
            var hash = Authentication.generateUserHash(Userinfo.PasswordHash);
            var User = _context.Users
                       .Include(x => x.UserLocations)
                       .ThenInclude(x => x.UserPermission)
                       .FirstOrDefault(u => u.Email == Userinfo.Email && u.PasswordHash == hash);

            if (User == null)
            {
                return(null);
            }

            if (!(User.IsEmailVerified ?? false))
            {
                string token = null;
                if (User.VerificationTokenExpiry < DateTime.UtcNow)
                {
                    while (token == null || _context.Users.Any(u => u.VerificationToken == token))
                    {
                        token = Authentication.generateEmailTokenHash();
                    }
                }
                else
                {
                    token = User.VerificationToken;
                }
                EmailOperations.sendVerificationEmailAsync(User.Name, User.Email, token);
                return(null);
            }

            var ret = new Authentication(_context, _mapper).generateJwtToken(User);


            return(ret);
        }