public IAuditConfigBuilder WithStore(IAuditStore auditStore) { if (null != auditStore) { _auditStores.Add(auditStore); } return(this); }
public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { IAuditStore auditStore = null; AuditOperation auditedOperation = null; // 必须保证审计和业务用的是不同的 DbContext 不然,会导致数据异常入库 using var scope = context.HttpContext.RequestServices.CreateScope(); if (Conts.MethodDict.ContainsKey(context.HttpContext.Request.Method)) { auditStore = scope.ServiceProvider.GetService <IAuditStore>(); if (auditStore == null) { throw new MicroserviceFrameworkException("AuditStore is not registered"); } var ua = context.HttpContext.Request.Headers["User-Agent"].ToString(); var ip = context.GetRemoteIpAddress(); var url = context.HttpContext.Request.GetDisplayUrl(); var deviceId = context.HttpContext.Request.Query["deviceId"].ToString(); var deviceModel = context.HttpContext.Request.Query["deviceId"].ToString(); var lat = context.HttpContext.Request.Query["lat"].ToString(); var lng = context.HttpContext.Request.Query["lng"].ToString(); auditedOperation = new AuditOperation( $"{context.HttpContext.Request.Method} {url}", ua, ip, string.IsNullOrEmpty(deviceModel) ? null : deviceModel, string.IsNullOrEmpty(deviceId) ? null : deviceId, double.TryParse(lat, out var a) ? a : null, double.TryParse(lng, out var n) ? n : null); auditedOperation.SetCreation( context.HttpContext.User.Identity is { IsAuthenticated: true } and ClaimsIdentity identity ? identity.GetUserId() : string.Empty); context.HttpContext.Items.Add("___AuditOperation", auditedOperation); } await base.OnActionExecutionAsync(context, next); // comment: 必须使用 HTTP request scope 的 uow manager 才能获取到审计对象 // comment: 只有有变化的数据才会尝试获取变更对象 if (auditStore != null && Conts.MethodDict.ContainsKey(context.HttpContext.Request.Method)) { var unitOfWork = context.HttpContext.RequestServices.GetService <IUnitOfWork>(); if (unitOfWork != null) { auditedOperation.AddEntities(unitOfWork.GetAuditEntities()); } auditedOperation.End(); await auditStore.AddAsync(auditedOperation); await auditStore.FlushAsync(); } }
public async override Task Invoke(AspectContext context, AspectDelegate next) { await next(context); _auditStore = context.ServiceProvider.GetService(typeof(IAuditStore)) as IAuditStore; _dictionaryAccessor = context.ServiceProvider.GetService(typeof(DictionaryAccessor)) as DictionaryAccessor; _dictionaryAccessor.TryGetValue("audit", out object auditEntry); Console.WriteLine($"{ auditEntry.ToString() }"); Console.WriteLine("萨迪克缴纳税款觉得那肯定安定安康九十年代看看见你看看"); }
/// <inheritdoc /> public override void OnResultExecuted(ResultExecutedContext context) { IServiceProvider provider = context.HttpContext.RequestServices; ScopedDictionary dict = provider.GetService <ScopedDictionary>(); if (dict.AuditOperation?.FunctionName == null) { return; } dict.AuditOperation.EndedTime = DateTime.Now; IUnitOfWork unitOfWork = provider.GetUnitOfWork <Function, Guid>(); //回滚之前业务处理中的未提交事务,防止审计信息保存时误提交 unitOfWork?.Rollback(); IAuditStore store = provider.GetService <IAuditStore>(); store?.Save(dict.AuditOperation); unitOfWork?.Commit(); }
/// <inheritdoc /> public override void OnResultExecuted(ResultExecutedContext context) { IServiceProvider provider = context.HttpContext.RequestServices; ScopedDictionary dict = provider.GetRequiredService <ScopedDictionary>(); if (dict.AuditOperation?.FunctionName == null) { return; } dict.AuditOperation.EndedTime = DateTime.Now; IUnitOfWork unitOfWork = provider.GetService <IUnitOfWork>(); unitOfWork?.Dispose(); //移除当前功能,使保存审计信息的时候不再获取记录变更,审计信息不需要再审计 dict.Function = null; provider.BeginUnitOfWorkTransaction(scopeProvider => { IAuditStore store = scopeProvider.GetService <IAuditStore>(); store?.Save(dict.AuditOperation); }); }
public AuditController(DbContextFactory dbContextFactory, IAuditStore auditStore) { _dbContextFactory = dbContextFactory; _auditStore = auditStore; }
public AuditLogController(IAuditStore auditStore) { _auditStore = auditStore; }
/// <summary> /// 初始化一个<see cref="AuditEntityStoreEventHandler"/>类型的新实例 /// </summary> public AuditEntityStoreEventHandler(IAuditStore auditStore) { _auditStore = auditStore; }
public AuditEntryController(IAuditStore auditStore) { _auditStore = auditStore; }
public AuditEntryController(IAuditStore auditStore, IAuditService auditService) { _auditStore = auditStore; _auditService = auditService; }
public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) { IAuditingConfiguration configuration = _provider.GetRequiredService <IAuditingConfiguration>(); if (!ShouldSaveAudit(context, configuration)) { await next(); return; } using (CrossCuttingConcerns.Applying(context.Controller, CrossCuttingConcerns.Auditing)) { IAuditStore store = _provider.GetService <IAuditStore>(); IFunction function = context.GetExecuteFunction(); //var auditInfo = store.CreateAuditInfo( // context.ActionDescriptor.AsControllerActionDescriptor().ControllerTypeInfo.AsType(), // context.ActionDescriptor.AsControllerActionDescriptor().MethodInfo, // context.ActionArguments //); Type type = context.ActionDescriptor.AsControllerActionDescriptor().ControllerTypeInfo.AsType(); List <Type> ignoredTypes = configuration.IgnoredTypes; AuditOperationEntry operation = new AuditOperationEntry { FunctionName = function.Name, ClientIpAddress = context.HttpContext.GetClientIp(), UserAgent = context.HttpContext.Request.Headers["User-Agent"].FirstOrDefault(), CreatedTime = DateTime.Now, ServiceName = type != null ? type.FullName : "", Parameters = ConvertArgumentsToJson(context.ActionArguments, ignoredTypes), }; if (context.HttpContext.User.Identity.IsAuthenticated && context.HttpContext.User.Identity is ClaimsIdentity identity) { operation.UserId = identity.GetUserId(); operation.UserName = identity.GetUserName(); } var stopwatch = Stopwatch.StartNew(); ActionExecutedContext result = null; try { result = await next(); if (result.Exception != null && !result.ExceptionHandled) { operation.Exception = result.Exception; } } catch (Exception ex) { operation.Exception = ex; throw; } finally { stopwatch.Stop(); operation.Elapsed = Convert.ToInt32(stopwatch.Elapsed.TotalMilliseconds); if (configuration.SaveReturnValues && result != null) { switch (result.Result) { case ObjectResult objectResult: operation.ReturnValue = AuditingHelper.Serialize(objectResult.Value, ignoredTypes); break; case JsonResult jsonResult: operation.ReturnValue = AuditingHelper.Serialize(jsonResult.Value, ignoredTypes); break; case ContentResult contentResult: operation.ReturnValue = contentResult.Content; break; case AjaxResult ajaxResult: operation.ReturnValue = ajaxResult.Content; break; } } await store.SaveAsync(operation); } } }