public virtual async Task <IEnumerable <TTenant> > FindByEmailAsync(string email)
        {
            ThrowIfDisposed();

            if (email == null)
            {
                throw new ArgumentNullException(nameof(email));
            }

            email = KeyNormalizer.MaybeNormalizeName(email);

            if (!(_userStore is IUserEmailStoreExtended <TUser> emailStore))
            {
                throw new NotSupportedException();
            }

            var users = await emailStore.FindAllByEmailAsync(email, CancellationToken);

            if (users != null || !Options.Stores.ProtectPersonalData)
            {
                if (!(users is IEnumerable <IdentityUserExtended <TKey> > ext))
                {
                    throw new NotSupportedException();
                }

                var tenantIds = ext.Select(x => $"{x.TenantId}");
                return(await _tenantStore.FindByIdsAsync(tenantIds, CancellationToken));
            }

            var protector = _serviceProvider.GetService(typeof(ILookupProtector)) as ILookupProtector;

            if (!(_serviceProvider.GetService(typeof(ILookupProtectorKeyRing)) is ILookupProtectorKeyRing service) ||
                protector == null)
            {
                return(null);
            }

            foreach (var allKeyId in service.GetAllKeyIds())
            {
                users = await emailStore.FindAllByEmailAsync(protector.Protect(allKeyId, email), CancellationToken);

                if (users is IEnumerable <IdentityUserExtended> ext)
                {
                    var tenantIds = ext.Select(x => $"{x.TenantId}");
                    var tenants   = await _tenantStore.FindByIdsAsync(tenantIds, CancellationToken);

                    if (tenants != null)
                    {
                        return(tenants);
                    }
                }
            }

            return(null);
        }