首页 > 解决方案 > 在数据层而不是单层应用程序中进行审计

问题描述

这是我的第一种任务,我正在使用本教程。 关联

不同之处在于本教程是在单层中制作的,因此很容易访问 Identity 属性。

我的项目有

  1. 数据层,数据库上下文所在的位置(以及所有模型数据库集)
  2. 引用数据、服务和表示层的实体(模型)
  3. 引用表示层的服务
  4. 表示层

问题是我将审核模型放在实体层中,但在本教程中,它具有 AspNetUsers 表的外键,并且代码优先迁移未通过。

he ForeignKeyAttribute on property 'AuditUserId' on type 'Namespace.Entities.AuditActions.Audit' is not valid. The navigation property 'AuditUser' was not found on the dependent type 'Namespace.Entities.AuditActions.Audit'. The Name value should be a valid navigation property name

第二个问题是我无法从我放置了保存覆盖的数据层访问用户信息。

var currentUser = OwinContextHelper.CurrentApplicationUser;

我无法从放置覆盖的数据层访问放置在表示层中的 OwinHelpper 类。

如何在我的应用程序中实施本教程?

任何想法都会受到欢迎。

我是初级开发人员,请放轻松:)

标签: c#asp.net-mvcauditmulti-layer

解决方案


试图帮助您解决第二个问题:

对于这种用例,我会推荐Audit.NET / Audit.EF库(实际上我猜你已经在使用它了)。

您可以使用自定义操作避免信息从表示层传递到数据层。该库为您提供了挂钩审计创建的可能性,您可以将该代码放在表示层上,例如:

class Presentation
{
    void StartUp()
    {
        // Use SqlServerDataProvider to store the audit events on SQL
        Audit.Core.Configuration.Setup()
            .UseSqlServer(_ => _
                .ConnectionString("...")
                .TableName("Event")
                .IdColumnName("EventId")
                .JsonColumnName("Data"));

        // Add a custom action to have a custom field 
        Audit.Core.Configuration.AddOnCreatedAction(scope =>
        {
            scope.SetCustomField("OwinUser", OwinContextHelper.CurrentApplicationUser);
        });
    }
}

推荐阅读