Пример #1
0
        public async Task <HttpResponseMessage> ExecuteActionFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func <Task <HttpResponseMessage> > continuation)
        {
            var actionDescriptor = actionContext.ActionDescriptor as ReflectedHttpActionDescriptor;

            if (actionDescriptor == null || !_auditingHelper.ShouldSaveAudit(actionDescriptor?.MethodInfo, true))//此时说明不需要审计
            {
                return(await continuation());
            }

            var auditInfo = _auditingHelper.CreateAuditInfo(
                actionContext.ActionDescriptor.ControllerDescriptor.ControllerType,
                actionDescriptor.MethodInfo,
                actionContext.ActionArguments);

            var stopwatch = Stopwatch.StartNew();

            try
            {
                return(await continuation());
            }
            catch (Exception ex)
            {
                auditInfo.Exception = ex;//若发生异常则保存异常
                throw;
            }
            finally
            {
                stopwatch.Stop();
                auditInfo.ExecutionDuration = Convert.ToInt32(stopwatch.Elapsed.TotalMilliseconds);
                await _auditingHelper.SaveAsync(auditInfo);//插入审计信息到数据库
            }
        }
Пример #2
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="context"></param>
        /// <param name="audit"></param>
        /// <param name="auditAction"></param>
        /// <returns></returns>
        protected virtual bool ShouldIntercept(AspectContext context, out AuditInfo audit, out AuditActionInfo auditAction)
        {
            audit       = null;
            auditAction = null;

            if (CrossCuttingConcerns.IsApplied(context.Implementation, Concerns))
            {
                return(false);
            }
            if (context.ServiceMethod.AttributeExists <DisableAuditingAttribute>() || context.ImplementationMethod.AttributeExists <DisableAuditingAttribute>())
            {
                return(false);
            }
            var auditScope = _auditingManager.Current;

            if (auditScope == null)
            {
                return(false);
            }

            if (!_auditingHelper.ShouldSaveAudit(context.ImplementationMethod) && !_auditingHelper.ShouldSaveAudit(context.ServiceMethod))
            {
                return(false);
            }

            audit       = auditScope.Info;
            auditAction = _auditingHelper.CreateAuditAction(
                context.Implementation.GetType(), context.ImplementationMethod, context.Parameters
                );

            return(true);
        }
Пример #3
0
        protected virtual bool ShouldIntercept(
            IAbpMethodInvocation invocation,
            out AuditLogInfo auditLog,
            out AuditLogActionInfo auditLogAction)
        {
            auditLog       = null;
            auditLogAction = null;

            if (AbpCrossCuttingConcerns.IsApplied(invocation.TargetObject, AbpCrossCuttingConcerns.Auditing))
            {
                return(false);
            }

            var auditLogScope = _auditingManager.Current;

            if (auditLogScope == null)
            {
                return(false);
            }

            if (!_auditingHelper.ShouldSaveAudit(invocation.Method))
            {
                return(false);
            }

            auditLog       = auditLogScope.Log;
            auditLogAction = _auditingHelper.CreateAuditLogAction(
                auditLog,
                invocation.TargetObject.GetType(),
                invocation.Method,
                invocation.Arguments
                );

            return(true);
        }
Пример #4
0
        public void Intercept(IInvocation invocation)
        {
            //判断过滤器是否已经处理了过了
            if (AbpCrossCuttingConcerns.IsApplied(invocation.InvocationTarget, AbpCrossCuttingConcerns.Auditing))
            {
                invocation.Proceed();
                return;
            }
            //通过 IAuditingHelper 来判断当前方法是否需要记录审计日志信息
            if (!_auditingHelper.ShouldSaveAudit(invocation.MethodInvocationTarget))
            {
                invocation.Proceed();
                return;
            }
            // 构造审计信息
            var auditInfo = _auditingHelper.CreateAuditInfo(invocation.TargetType, invocation.MethodInvocationTarget, invocation.Arguments);

            //判断方法的类型,同步方法与异步方法的处理逻辑不一样
            if (invocation.Method.IsAsync())
            {
                PerformAsyncAuditing(invocation, auditInfo);
            }
            else
            {
                PerformSyncAuditing(invocation, auditInfo);
            }
        }
Пример #5
0
        public void Intercept(IInvocation invocation)
        {
            if (AbpCrossCuttingConcerns.IsApplied(invocation.InvocationTarget, AbpCrossCuttingConcerns.Auditing))
            {
                invocation.Proceed();
                return;
            }

            if (!_auditingHelper.ShouldSaveAudit(invocation.MethodInvocationTarget))
            {
                invocation.Proceed();
                return;
            }

            var auditInfo = _auditingHelper.CreateAuditInfo(invocation.TargetType, invocation.MethodInvocationTarget, invocation.Arguments);

            if (AsyncHelper.IsAsyncMethod(invocation.Method))
            {
                PerformAsyncAuditing(invocation, auditInfo);
            }
            else
            {
                PerformSyncAuditing(invocation, auditInfo);
            }
        }
Пример #6
0
        private bool ShouldSaveAudit(ActionExecutingContext filterContext)
        {
            var currentMethodInfo = filterContext.ActionDescriptor.GetMethodInfoOrNull();

            if (currentMethodInfo == null)
            {
                return(false);
            }

            if (_configuration == null)
            {
                return(false);
            }

            if (!_configuration.IsAuditingEnabled)
            {
                return(false);
            }

            if (filterContext.IsChildAction && !_configuration.IsAuditingEnabledForChildActions)
            {
                return(false);
            }

            return(_auditingHelper.ShouldSaveAudit(currentMethodInfo, true));
        }
Пример #7
0
        /// <summary>
        /// Shoulds the intercept.
        /// </summary>
        /// <param name="invocation">The invocation.</param>
        /// <param name="auditLog">The audit log.</param>
        /// <param name="auditLogAction">The audit log action.</param>
        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
        protected virtual bool ShouldIntercept(
            IMethodInvocation invocation,
            out AuditLogInfo auditLog,
            out AuditLogActionInfo auditLogAction)
        {
            auditLog       = null;
            auditLogAction = null;

            if (CrossCuttingConcerns.IsApplied(invocation.TargetObject, CrossCuttingConcerns.Auditing))
            {
                return(false);
            }
            // 如果没有获取到 Scop,则返回 false。
            var auditLogScope = _auditingManager.Current;

            if (auditLogScope == null)
            {
                return(false);
            }
            // 进行二次判断是否需要存储审计日志。
            if (!_auditingHelper.ShouldSaveAudit(invocation.Method))
            {
                return(false);
            }
            // 构建审计日志信息。
            auditLog       = auditLogScope.Log;
            auditLogAction = _auditingHelper.CreateAuditLogAction(
                auditLog,
                invocation.TargetObject.GetType(),
                invocation.Method,
                invocation.Arguments
                );

            return(true);
        }
Пример #8
0
 private bool ShouldSaveAudit(HttpActionContext context)
 {
     if (context.ActionDescriptor.IsDynamicInfrastructureAction())
     {
         return(false);
     }
     return(_auditingHelper.ShouldSaveAudit(context.ActionDescriptor.GetMethodInfoOrNull(), true));
 }
        private bool ShouldSaveAudit(ActionExecutingContext actionContext)
        {
            if (!_auditingConfiguration.IsEnabled || !_auditingConfiguration.MvcControllers.IsEnabled)
            {
                return(false);
            }

            return(_auditingHelper.ShouldSaveAudit(actionContext.ActionDescriptor.GetMethodInfo(), true));
        }
Пример #10
0
        /// <summary>
        ///     是否需要审计
        /// </summary>
        /// <param name="filterContext"></param>
        /// <returns></returns>
        private bool ShouldSaveAudit(ActionExecutingContext filterContext)
        {
            var currentMethodInfo = filterContext.ActionDescriptor.GetMethodInfoOrNull();

            if (currentMethodInfo == null)
            {
                return(false);
            }

            return(_auditingHelper.ShouldSaveAudit(currentMethodInfo, true));//默认为true
        }
        public override void InterceptSynchronous(IInvocation invocation)
        {
            if (AbpCrossCuttingConcerns.IsApplied(invocation.InvocationTarget, AbpCrossCuttingConcerns.Auditing))
            {
                invocation.Proceed();
                return;
            }

            if (!_auditingHelper.ShouldSaveAudit(invocation.MethodInvocationTarget))
            {
                invocation.Proceed();
                return;
            }

            var auditInfo = _auditingHelper.CreateAuditInfo(invocation.TargetType, invocation.MethodInvocationTarget, invocation.Arguments);

            var stopwatch = Stopwatch.StartNew();

            try
            {
                invocation.Proceed();
            }
            catch (Exception ex)
            {
                auditInfo.Exception = ex;
                throw;
            }
            finally
            {
                stopwatch.Stop();
                auditInfo.ExecutionDuration = Convert.ToInt32(stopwatch.Elapsed.TotalMilliseconds);

                if (_auditingConfiguration.SaveReturnValues && invocation.ReturnValue != null)
                {
                    auditInfo.ReturnValue = _auditSerializer.Serialize(invocation.ReturnValue);
                }

                _auditingHelper.Save(auditInfo);
            }
        }
Пример #12
0
        private bool ShouldSaveAudit(HttpActionContext context)
        {
            if (!_auditingConfiguration.IsEnabled)
            {
                return(false);
            }

            if (context.ActionDescriptor.IsDynamicAbpAction())
            {
                return(false);
            }

            return(_auditingHelper.ShouldSaveAudit(context.ActionDescriptor.GetMethodInfoOrNull(), true));
        }
Пример #13
0
        private bool ShouldSaveAudit(ActionExecutingContext context, out AuditLogInfo auditLog,
                                     out AuditLogActionInfo auditLogAction)
        {
            auditLog       = null;
            auditLogAction = null;
            var method = context.HttpContext.Request.Method;

            if (method.Equals(HttpMethod.Options.Method, StringComparison.OrdinalIgnoreCase))
            {
                return(false);
            }

            if (!Options.IsEnabled)
            {
                return(false);
            }

            if (!context.ActionDescriptor.IsControllerAction())
            {
                return(false);
            }

            var auditLogScope = _auditingManager.Current;

            if (auditLogScope == null)
            {
                return(false);
            }

            if (!_auditingHelper.ShouldSaveAudit(context.ActionDescriptor.GetMethodInfo(), true))
            {
                return(false);
            }

            auditLog          = auditLogScope.Log;
            auditLog.UserId   = _currentUser?.Id;
            auditLog.UserName = _currentUser?.UserName;
            auditLogAction    = _auditingHelper.CreateAuditLogAction(
                auditLog,
                context.ActionDescriptor.AsControllerActionDescriptor().ControllerTypeInfo.AsType(),
                context.ActionDescriptor.AsControllerActionDescriptor().MethodInfo,
                context.ActionArguments
                );

            return(true);
        }
Пример #14
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="context"></param>
        /// <param name="audit"></param>
        /// <param name="auditAction"></param>
        /// <returns></returns>
        protected virtual bool ShouldIntercept(IMethodInvocation context, out AuditInfo audit, out AuditActionInfo auditAction)
        {
            audit       = null;
            auditAction = null;
            if (!_options.IsEnabled)
            {
                return(false);
            }
            if (!(_options.IsEnabledForAnonymousUsers || (_principalAccessor.Principal?.Identity?.IsAuthenticated ?? false)))
            {
                return(false);
            }
            if (CrossCuttingConcerns.IsApplied(context.TargetObject, Concerns))
            {
                return(false);
            }
            if (context.Method.AttributeExists <AuditedAttribute>())
            {
                return(true);
            }
            if (context.Method.AttributeExists <DisableAuditingAttribute>())
            {
                return(false);
            }

            var auditScope = _auditingManager.Current;

            if (auditScope == null)
            {
                return(false);
            }

            if (!_auditingHelper.ShouldSaveAudit(context.Method, true))
            {
                return(false);
            }

            audit       = auditScope.Info;
            auditAction = _auditingHelper.CreateAuditAction(
                context.TargetObject.GetType(), context.Method, context.Arguments
                );

            return(true);
        }
Пример #15
0
        public void Intercept(IInvocation invocation)
        {
            if (!_auditingHelper.ShouldSaveAudit(invocation.MethodInvocationTarget))
            {
                invocation.Proceed();
                return;
            }
            var auditInfo = _auditingHelper.CreateAuditInfo(invocation.TargetType, invocation.MethodInvocationTarget, invocation.Arguments);

            if (invocation.Method.ReturnType == typeof(Task) ||
                (invocation.Method.ReturnType.GetTypeInfo().IsGenericType&& invocation.Method.ReturnType.GetGenericTypeDefinition() == typeof(Task <>)))
            {
                PerformAsyncAuditing(invocation, auditInfo);
            }
            else
            {
                PerformSyncAuditing(invocation, auditInfo);
            }
        }
Пример #16
0
        private bool ShouldSaveAudit(ActionExecutingContext context, out AuditLogInfo auditLog, out AuditLogActionInfo auditLogAction)
        {
            auditLog       = null;
            auditLogAction = null;

            if (!Options.IsEnabled)
            {
                return(false);
            }

            if (!context.ActionDescriptor.IsControllerAction())
            {
                return(false);
            }

            var auditLogScope = _auditingManager.Current;

            if (auditLogScope == null)
            {
                return(false);
            }

            if (!_auditingHelper.ShouldSaveAudit(context.ActionDescriptor.GetMethodInfo(), true))
            {
                return(false);
            }

            //TODO: This is partially duplication of AuditHelper.ShouldSaveAudit method. Check why it does not work for controllers
            if (!AuditingInterceptorRegistrar.ShouldAuditTypeByDefault(context.Controller.GetType()))
            {
                return(false);
            }

            auditLog       = auditLogScope.Log;
            auditLogAction = _auditingHelper.CreateAuditLogAction(
                auditLog,
                context.ActionDescriptor.AsControllerActionDescriptor().ControllerTypeInfo.AsType(),
                context.ActionDescriptor.AsControllerActionDescriptor().MethodInfo,
                context.ActionArguments
                );

            return(true);
        }
        public void OnAuthorization(AuthorizationContext filterContext)
        {
            if (filterContext.IsChildAction)
            {
                return;
            }
            var methodInfo = filterContext.ActionDescriptor.GetMethodInfoOrNull();

            if (methodInfo == null)
            {
                return;
            }

            if (_auditingHelper.ShouldSaveAudit(methodInfo) && _userContext.GetCurrentUser() == null
                )
            {
                HandleUnauthorizedRequest(filterContext, methodInfo)
                ;
            }
        }
Пример #18
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="context"></param>
        /// <param name="audit"></param>
        /// <param name="auditAction"></param>
        /// <returns></returns>
        protected virtual bool ShouldIntercept(AspectContext context, out AuditInfo audit, out AuditActionInfo auditAction)
        {
            audit       = null;
            auditAction = null;
            if (_options.IsEnabled == false)
            {
                return(false);
            }
            if (!(_options.IsEnabledForAnonymousUsers || (_principalAccessor.Principal?.Identity?.IsAuthenticated ?? false)))
            {
                return(false);
            }
            if (CrossCuttingConcerns.IsApplied(context.Implementation, Concerns))
            {
                return(false);
            }

            if (context.ServiceMethod.AttributeExists <DisableAuditingAttribute>() || context.ImplementationMethod.AttributeExists <DisableAuditingAttribute>())
            {
                return(false);
            }

            var auditScope = _auditingManager.Current;

            if (auditScope == null)
            {
                return(false);
            }

            if (!_auditingHelper.ShouldSaveAudit(context.ImplementationMethod, true) && !_auditingHelper.ShouldSaveAudit(context.ServiceMethod, true))
            {
                return(false);
            }

            audit       = auditScope.Info;
            auditAction = _auditingHelper.CreateAuditAction(
                context.Implementation.GetType(), context.ImplementationMethod, context.Parameters
                );

            return(true);
        }
Пример #19
0
        protected virtual bool ShouldIntercept(IAbpMethodInvocation invocation,
                                               AbpAuditingOptions options,
                                               IAuditingHelper auditingHelper)
        {
            if (!options.IsEnabled)
            {
                return(false);
            }

            if (AbpCrossCuttingConcerns.IsApplied(invocation.TargetObject, AbpCrossCuttingConcerns.Auditing))
            {
                return(false);
            }

            if (!auditingHelper.ShouldSaveAudit(invocation.Method))
            {
                return(false);
            }

            return(true);
        }
Пример #20
0
        private bool ShouldSaveAudit(ActionExecutingContext context, out AuditInfo auditLog, out AuditActionInfo auditLogAction)
        {
            auditLog       = null;
            auditLogAction = null;

            if (!Options.IsEnabled)
            {
                return(false);
            }
            if (!Options.IsAuditingController())
            {
                return(false);
            }

            if (!context.ActionDescriptor.IsControllerAction())
            {
                return(false);
            }

            var auditLogScope = _auditingManager.Current;

            if (auditLogScope == null)
            {
                return(false);
            }

            if (!_auditingHelper.ShouldSaveAudit(context.ActionDescriptor.GetMethodInfo(), true))
            {
                return(false);
            }

            auditLog       = auditLogScope.Info;
            auditLogAction = _auditingHelper.CreateAuditAction(
                context.ActionDescriptor.AsControllerActionDescriptor().ControllerTypeInfo.AsType(),
                context.ActionDescriptor.AsControllerActionDescriptor().MethodInfo,
                context.ActionArguments
                );

            return(true);
        }
Пример #21
0
        private bool ShouldSaveAudit(PageHandlerExecutingContext context, out AuditInfo auditLog, out AuditActionInfo auditLogAction)
        {
            auditLog       = null;
            auditLogAction = null;

            if (!Options.IsEnabled)
            {
                return(false);
            }

            if (!Options.IsAuditingPage())
            {
                return(false);
            }

            if (!(context.ActionDescriptor is CompiledPageActionDescriptor))
            {
                return(false);
            }

            var auditLogScope = _auditingManager.Current;

            if (auditLogScope == null)
            {
                return(false);
            }

            if (!_auditingHelper.ShouldSaveAudit(context.HandlerMethod.MethodInfo, true))
            {
                return(false);
            }
            auditLog       = auditLogScope.Info;
            auditLogAction = _auditingHelper.CreateAuditAction(
                context.ActionDescriptor.HandlerTypeInfo,
                context.HandlerMethod.MethodInfo,
                context.HandlerArguments
                );

            return(true);
        }
 private bool ShouldSaveAudit(PageHandlerExecutingContext actionContext)
 {
     return(_configuration.IsAuditingEnabled &&
            _auditingHelper.ShouldSaveAudit(actionContext.HandlerMethod.MethodInfo, true));
 }
 private bool ShouldSaveAudit(ActionExecutingContext actionContext)
 {
     return(_configuration.IsAuditingEnabled &&
            actionContext.ActionDescriptor.IsControllerAction() &&
            _auditingHelper.ShouldSaveAudit(actionContext.ActionDescriptor.GetMethodInfo(), true));
 }
Пример #24
0
        public void ShouldSaveAuditForAttribute(Type type, bool result)
        {
            var method = type.GetMethod("Method");

            _auditingHelper.ShouldSaveAudit(method).ShouldBe(result);
        }