public async override Task RemoveClaimsAsync(ApplicationUser user, IEnumerable <Claim> claims, CancellationToken cancellationToken = default(CancellationToken))
        {
            cancellationToken.ThrowIfCancellationRequested();
            ThrowIfDisposed();

            ValidateParameters(user, claims);

            var auditableObjs = new AuditableObjects <ApplicationUserClaim>();

            foreach (var claim in claims)
            {
                var matchedClaims = await Context.Set <ApplicationUserClaim>().Where(uc => uc.UserId.Equals(user.Id) && uc.ClaimValue == claim.Value && uc.ClaimType == claim.Type).ToListAsync(cancellationToken);

                foreach (var userClaim in matchedClaims)
                {
                    Context.Set <ApplicationUserClaim>().Remove(userClaim);

                    auditableObjs.AddObject(userClaim.Id.ToString(), userClaim);
                }
            }

            if (auditableObjs.Any() && !user.IsSystemUser)
            {
                await auditTrailProvider.AddTrailsAsync(AuditOperation.Delete, userPrincipalBuilder.UserPrincipal.UserName, auditableObjs);
            }
        }
        public async Task AddTrailsAsync <T>(AuditOperation auditOperation, string user, AuditableObjects <T> auditableObjects, IEnumerable <string> namesOfPropertiesToIgnore) where T : class
        {
            if (!auditConfigurationSqlServer.Enable.Value)
            {
                return;
            }

            var trails = auditableObjects.Select(o => new AuditTrail(
                                                     auditableObjects.TransactionId,
                                                     auditableObjects.Timestamp,
                                                     auditConfigurationSqlServer.ApplicationId,
                                                     auditOperation,
                                                     user,
                                                     httpContextAccessor.HttpContext?.Connection?.RemoteIpAddress?.ToString(),
                                                     o.Key,
                                                     o.Value,
                                                     namesOfPropertiesToIgnore));

            var transactionBuilder = new StringBuilder();

            foreach (var trail in trails)
            {
                transactionBuilder.Append($@"
                    insert into
                        [{auditConfigurationSqlServer.SqlServer.DatabaseName}].
                        [{auditConfigurationSqlServer.SqlServer.SchemaName}].
                        [{auditConfigurationSqlServer.SqlServer.TableName}]
                        (
                            [{nameof(AuditTrail.Id)}], 
                            [{nameof(AuditTrail.TransactionId)}], 
                            [{nameof(AuditTrail.Timestamp)}], 
                            [{nameof(AuditTrail.ApplicationId)}], 
                            [{nameof(AuditTrail.Operation)}], 
                            [{nameof(AuditTrail.User)}],
                            [{nameof(AuditTrail.Origin)}],
                            [{nameof(AuditTrail.ObjectAssembly)}],
                            [{nameof(AuditTrail.ObjectId)}],
                            [{nameof(AuditTrail.ObjectSerial)}]
                        )
                    values
                        (
                            '{trail.Id}',
                            '{trail.TransactionId}',
                            '{trail.Timestamp.ToString("yyyy-MM-dd HH:mm:ss.fff") }',
                            '{trail.ApplicationId}',
                            '{trail.Operation}',
                            '{trail.User}',
                            {(!string.IsNullOrWhiteSpace(trail.Origin) ? $"'{trail.Origin}'" : "NULL")},
                            '{trail.ObjectAssembly}',
                            '{trail.ObjectId}',
                            {(!string.IsNullOrWhiteSpace(trail.ObjectSerial) ? $"'{trail.ObjectSerial}'" : "NULL")}
                        );");
            }

            await auditContext.ExecuteWithTransactionAsync(transactionBuilder.ToString());
        }
 public async Task AddTrailsAsync <T>(AuditOperation auditOperation, string user, AuditableObjects <T> auditableObjects) where T : class =>
 await AddTrailsAsync(auditOperation, user, auditableObjects, null);