public void OnActionExecuting(ActionExecutingContext context) { IServiceProvider provider = context.HttpContext.RequestServices; IFunction function = context.GetExecuteFunction(); if (function == null) { return; } ScopedDictionary dict = provider.GetService <ScopedDictionary>(); dict.Function = function; // 数据权限有效角色,即有当前功能权限的角色 IFunctionAuthorization functionAuthorization = provider.GetService <IFunctionAuthorization>(); ClaimsPrincipal principal = context.HttpContext.User; string[] roleName = functionAuthorization.GetOkRoles(function, principal); dict.DataAuthValidRoleNames = roleName; IAuditingConfiguration configuration = provider.GetRequiredService <IAuditingConfiguration>(); if (!AuditingHelper.ShouldSaveAudit(configuration, principal, function, context.ActionDescriptor.GetMethodInfo())) { return; } AuditOperationEntry operation = new AuditOperationEntry { FunctionName = function.Name, ClientIpAddress = context.HttpContext.GetClientIp(), UserAgent = context.HttpContext.Request.Headers["User-Agent"].FirstOrDefault(), CreatedTime = DateTime.Now }; if (principal.Identity.IsAuthenticated && principal.Identity is ClaimsIdentity identity) { operation.UserId = identity.GetUserId(); operation.UserName = identity.GetUserName(); operation.NickName = identity.GetNickName(); } dict.AuditOperation = operation; }
/// <inheritdoc /> public override void OnActionExecuting(ActionExecutingContext context) { IServiceProvider provider = context.HttpContext.RequestServices; IFunction function = context.GetExecuteFunction(); if (function == null) { return; } ScopedDictionary dict = provider.GetService <ScopedDictionary>(); dict.Function = function; // 数据权限有效角色,即有当前功能权限的角色 IFunctionAuthorization functionAuthorization = provider.GetService <IFunctionAuthorization>(); string[] roleName = functionAuthorization.GetOkRoles(function, context.HttpContext.User); dict.DataAuthValidRoleNames = roleName; if (!function.AuditOperationEnabled) { return; } AuditOperationEntry operation = new AuditOperationEntry { FunctionName = function.Name, Ip = context.HttpContext.GetClientIp(), UserAgent = context.HttpContext.Request.Headers["User-Agent"].FirstOrDefault(), CreatedTime = DateTime.Now }; if (context.HttpContext.User.Identity.IsAuthenticated && context.HttpContext.User.Identity is ClaimsIdentity identity) { operation.UserId = identity.GetUserId(); operation.UserName = identity.GetUserName(); operation.NickName = identity.GetNickName(); } dict.AuditOperation = operation; }
private static AuditOperation BuildOperation(AuditOperationEntry operationEntry) { AuditOperation operation = operationEntry.MapTo <AuditOperation>(); if (operationEntry.UserAgent != null) { UserAgent userAgent = new UserAgent(operationEntry.UserAgent); operation.OperationSystem = userAgent.GetSystem(); operation.Browser = userAgent.GetBrowser(); } operation.Elapsed = (int)operationEntry.EndedTime.Subtract(operationEntry.CreatedTime).TotalMilliseconds; foreach (AuditEntityEntry entityEntry in operationEntry.EntityEntries) { AuditEntity entity = entityEntry.MapTo <AuditEntity>(); operation.AuditEntities.Add(entity); foreach (AuditPropertyEntry propertyEntry in entityEntry.PropertyEntries) { AuditProperty property = propertyEntry.MapTo <AuditProperty>(); entity.Properties.Add(property); } } return(operation); }
/// <summary> /// 异步保存实体审计数据 /// </summary> /// <param name="operationEntry">操作审计数据</param> /// <param name="cancelToken">异步取消标识</param> /// <returns></returns> public async Task SaveAsync(AuditOperationEntry operationEntry, CancellationToken cancelToken = default(CancellationToken)) { AuditOperation operation = BuildOperation(operationEntry); await _operationRepository.InsertAsync(operation); }
/// <summary> /// 设置保存审计数据 /// </summary> /// <param name="operationEntry">操作审计数据</param> public void Save(AuditOperationEntry operationEntry) { AuditOperation operation = BuildOperation(operationEntry); _operationRepository.Insert(operation); }
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); } } }