JH-Sen-Ren
JH-Sen-Ren

Reputation: 279

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

I am having difficulty understanding the documentation for the Audit.NET Entity Framework Data Provider, to save Audit.NET WebAPI audit logs to my database.

This is how I have my Audit configuration set, just to test. I have a breakpoint inside the AuditEntityAction on entity.ChangeType = ev.EventType, but this never gets hit when I call an audited action on my controller.

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()
        );

On my controller action, I have the decorator:

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

Is this correct? I am not very clear on this, and I would appreciate some pointers.

Upvotes: 3

Views: 2423

Answers (2)

Ahmed Anwar
Ahmed Anwar

Reputation: 47

You can use Audit.NetWebApi package to get the WebApiAudit logs

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;
                    }
                
            });
        }

And then put this function in Startup.cs ConfigureApp

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

Constants used:

 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";

Upvotes: 0

thepirat000
thepirat000

Reputation: 13114

The Entity Framework Data Provider is part of the library Audit.EntityFramework and was designed to exclusively store the audits that are generated by an audited Entity Framework DbContext.

So it will not work for WebApi events of any other kind of event.

Here you can see how the audit event is discarded if it's not an AuditEventEntityFramework

So you should create your own Custom Data Provider or maybe use the SQL Data Provider.

Upvotes: 3

Related Questions