コード例 #1
0
        public IAuditConfigBuilder WithStore(IAuditStore auditStore)
        {
            if (null != auditStore)
            {
                _auditStores.Add(auditStore);
            }

            return(this);
        }
コード例 #2
0
    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();
        }
    }
コード例 #3
0
        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("萨迪克缴纳税款觉得那肯定安定安康九十年代看看见你看看");
        }
コード例 #4
0
        /// <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();
        }
コード例 #5
0
        /// <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);
            });
        }
コード例 #6
0
 public AuditController(DbContextFactory dbContextFactory, IAuditStore auditStore)
 {
     _dbContextFactory = dbContextFactory;
     _auditStore       = auditStore;
 }
コード例 #7
0
 public AuditLogController(IAuditStore auditStore)
 {
     _auditStore = auditStore;
 }
コード例 #8
0
 /// <summary>
 /// 初始化一个<see cref="AuditEntityStoreEventHandler"/>类型的新实例
 /// </summary>
 public AuditEntityStoreEventHandler(IAuditStore auditStore)
 {
     _auditStore = auditStore;
 }
コード例 #9
0
 public AuditEntryController(IAuditStore auditStore)
 {
     _auditStore = auditStore;
 }
コード例 #10
0
 public AuditEntryController(IAuditStore auditStore, IAuditService auditService)
 {
     _auditStore   = auditStore;
     _auditService = auditService;
 }
コード例 #11
0
        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);
                }
            }
        }