如何使用 Audit.NET Entity Framework 数据提供程序保存 Audit.NET WebAPI 审计日志?

How do I use Audit.NET Entity Framework Data Provider to save Audit.NET WebAPI audit logs?

我很难理解 Audit.NET Entity Framework 数据提供程序的文档,无法将 Audit.NET WebAPI 审计日志保存到我的数据库中。

这就是我设置审计配置的方式,只是为了测试。我在 entity.ChangeType = ev.EventType 上的 AuditEntityAction 中有一个断点,但是当我在我的控制器上调用审计操作时,这个断点永远不会被击中。

Audit.Core.Configuration.Setup()
    .UseEntityFramework(x => 
        x.AuditTypeMapper(t => typeof(AuditLog))
            .AuditEntityAction<AuditLog>((ev, entry, entity) =>
            {
                entity.ChangeType = ev.EventType;
                entity.ObjectType = entry.EntityType.Name;
                entity.PrimaryKey = "test";
                entity.TableName = "test";
                entity.UserId = entry.CustomFields[UserIdField].ToString();
            })
            .IgnoreMatchedProperties()
        );

在我的控制器操作中,我有装饰器:

[AuditApi(EventTypeName = "Organisation:Create", IncludeRequestBody = true, IncludeResponseBody = true)]

这是正确的吗?这个我不是很清楚,希望大家指点。

Entity Framework 数据提供程序是库 Audit.EntityFramework 的一部分,旨在专门存储由已审核的 Entity Framework DbContext 生成的审核。

因此它不适用于任何其他类型事件的 WebApi 事件。

Here 如果审计事件不是 AuditEventEntityFramework

,您可以看到审计事件是如何被丢弃的

所以您应该创建自己的 Custom Data Provider or maybe use the SQL Data Provider

您可以使用 Audit.NetWebApi 包获取 WebApiAudit 日志

public static void UseAudit(this IApplicationBuilder app, IHttpContextAccessor contextAccessor)
        {
            Audit.Core.Configuration.AddCustomAction(ActionType.OnScopeCreated, scope =>
            {
              
                    var entityTrack = scope.Event.GetEntityFrameworkEvent();
                    var requestTrack = scope.Event.GetWebApiAuditAction();
                    if (entityTrack!=null)
                    {
                        foreach (var item in entityTrack.Entries)
                        {
                            scope.Event.CustomFields[Table] = item.Table;
                            scope.Event.CustomFields[Action] = item.Action;
                        }
                    }
                    else if(requestTrack!=null)
                    {
                      
                        scope.Event.CustomFields[Action] = $"{requestTrack.ActionName}:{requestTrack.ActionName}";
                        scope.Event.CustomFields[RequestBody] = requestTrack.RequestBody.Value.ToString();
                        scope.Event.CustomFields[ResponseBody] = requestTrack.ResponseBody?.Value?.ToString()?? string.Empty;
                        scope.Event.CustomFields[Exception] = requestTrack.Exception?? string.Empty;
                    }
                
            });
        }

然后把这个函数放在Startup.cs ConfigureApp

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IHttpContextAccessor contextAccessor)
            {
app.UseAudit(contextAccessor);
}

使用的常量:

 private const string Table = "Table";
        private const string Action = "Action";           
        private const string RequestBody = "RequestBody";
        private const string ResponseBody = "ResponseBody";
        private const string Exception = "Exception";