在数据层而不是单层应用程序中进行审计

Posted

技术标签:

【中文标题】在数据层而不是单层应用程序中进行审计【英文标题】:Audit in Data Layer instead of single Layer Application 【发布时间】:2019-07-15 04:07:56 【问题描述】:

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

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

我的项目有

    数据库上下文所在的数据层(以及所有模型数据库集) 引用数据、服务和表示层的实体(模型) 引用表示层的服务 表示层

问题是我将审核模型放在实体层中,但在教程中它具有 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 类。

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

欢迎任何想法。

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

【问题讨论】:

不幸的是,我认为这个问题不适合 SO。我很想坐在你旁边帮助你:-) 【参考方案1】:

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

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

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

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

【讨论】:

以上是关于在数据层而不是单层应用程序中进行审计的主要内容,如果未能解决你的问题,请参考以下文章

如何显示预训练模型的层而不是 model.summary() 输出中的单个条目?

为啥不使用 Flatten 后跟 Dense 层而不是 TimeDistributed?

神经网络算法:单层感知器算法原理及应用

如何在 3 层(单层)应用程序中在 BLL 和 UI 之间传递数据?

将授权放在服务层而不是 Web API 层

如何使用 HitTest 获得最前面的层而不是最深层