IdentityUser 上的 AuditIgnore - Audit.Net

AuditIgnore on IdentityUser - Audit.Net

我正在使用 Audit.Net 来跟踪更改。很好的图书馆

通过使用Audit.EntityFramework扩展,我们可以忽略要跟踪的属性。

public class User
{
    public int Id { get; set; }
    [AuditIgnore]
    public string Password { get; set; }
    ...
}

但是我有问题

  1. 我没有使用 Audit.EntityFramework 扩展程序。只需使用我自己的自定义数据提供程序获取 json 格式。所以[AuditIgnore]不能在这里工作。
  2. 如何忽略 IdentityUser class 上的 password property

这是我的自定义数据提供程序

public class MyCustomDataProvider : AuditDataProvider
    {
        public override object InsertEvent(AuditEvent auditEvent)
        {
            var AuditEventInJson = auditEvent.ToJson();

            //Save into to DB;
        }
    }

ToJson() 方法将在内部使用 JSON.NET 库来序列化事件,并将使用静态 属性 Audit.Core.Configuration.JsonSettings

中的默认设置

所以如果你可以更改包含密码的class的代码,你可以使用JsonIgnore属性:

public class User
{
    [JsonIgnore]
    public string Password { get; set; }
    ...
}

或者,如果您不能装饰 属性,您可以创建一个自定义 Contract Resolver 来忽略一般属性,例如忽略任何名为 "Password" 的 属性:

class MyCustomResolver : DefaultContractResolver
{
    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
    {
        var props = base.CreateProperties(type, memberSerialization);
        return props.Where(p => p.PropertyName != "Password").ToList();
    }
}

为了使用 Audit.NET ToJson() 方法,您需要在 Audit.NET 全局配置上设置合约解析器,如下所示:

Audit.Core.Configuration.JsonSettings.ContractResolver = new MyCustomResolver();

第三个选项是附加一个 Custom Action 以在事件保存发生之前删除要忽略的属性,例如:

Audit.Core.Configuration.AddCustomAction(ActionType.OnEventSaving, scope =>
{
    var efEvent = scope.Event.GetEntityFrameworkEvent();
    efEvent.Entries.ForEach(e => 
    { 
        e.Changes.RemoveAll(ch => ch.ColumnName == "Password");
    });
});