public async Task <string> GenerateVerificationToken(Guid identityId, CancellationToken cancellationToken = default(CancellationToken))
        {
            var verificationToken       = Security.GenerateToken();
            var verificationTokenEntity = new AzureVerificationTokenEntity
            {
                VerificationToken = verificationToken,
                IdentityId        = identityId
            };

            var createOperation = TableOperation.Insert(verificationTokenEntity);
            var result          = await this.VerificationTokenTable.ExecuteAsync(createOperation, null, null, cancellationToken).ConfigureAwait(false);

            return(verificationToken);
        }
        public async Task <IIdentityEntity> VerifyVerificationToken(string verificationToken, bool deleteTokenOnRetrieval = true, CancellationToken cancellationToken = default(CancellationToken))
        {
            // Check to see if VerificationToken exists
            var retrieveOperation = TableOperation.Retrieve <AzureVerificationTokenEntity>(Constants.PartitionNames.VerificationTokenPrimary, verificationToken);
            var retrievedResult   = await this.VerificationTokenTable.ExecuteAsync(retrieveOperation, null, null, cancellationToken).ConfigureAwait(false);

            var retrievedEntity = (AzureVerificationTokenEntity)retrievedResult?.Result;

            if (retrievedEntity == null)
            {
                throw new KeyNotFoundException($"The VerificationToken '{verificationToken}' was not found");
            }

            // Retrieve IdentityEntity
            var retrieveIdentityOperation = TableOperation.Retrieve <AzureIdentityEntity>(Constants.PartitionNames.IdentityPrimary, retrievedEntity.IdentityId.ToString());
            var retrievedIdentityResult   = await this.IdentityTable.ExecuteAsync(retrieveIdentityOperation, null, null, cancellationToken).ConfigureAwait(false);

            var retrievedIdentityEntity = (AzureIdentityEntity)retrievedIdentityResult?.Result;

            // Set verified property
            retrievedIdentityEntity.EmailVerified = true;
            var setOperation = TableOperation.InsertOrReplace(retrievedIdentityEntity);
            var result       = await this.IdentityTable.ExecuteAsync(setOperation, null, null, cancellationToken).ConfigureAwait(false);

            // Clean up if required
            if (!deleteTokenOnRetrieval)
            {
                return(retrievedIdentityEntity);
            }

            // Delete the verification token record
            var deleteVerificationEntity = new AzureVerificationTokenEntity
            {
                PartitionKey = Constants.PartitionNames.VerificationTokenPrimary,
                RowKey       = retrievedEntity.VerificationToken.ToString(),
                ETag         = "*"
            };

            // Delete identity and identity foreign key
            var deleteEntityOperation = TableOperation.Delete(deleteVerificationEntity);
            var entityDeleteResult    = await this.VerificationTokenTable.ExecuteAsync(deleteEntityOperation, null, null, cancellationToken).ConfigureAwait(false);

            return(retrievedIdentityEntity);
        }