当我无权访问 HttpContext 时,如何填充我的审计日志 UserId 字段?

JH-*_*Ren 5 c# entity-framework audit.net

我有一个包含两个项目的解决方案,我的 API 层和我的数据层。

数据层使用实体框架,不了解ASP.NET WebApi。

API 层使用 ASP.NET WebApi。

我计划使用 Audit.NET 来审核记录更改。

目前,我已经在我的 API 项目中安装了 Audit.NET、Audit.EntityFramework 和 Audit.WebApi。

我希望使用审计过滤器属性。( config.Filters.Add(new AuditApiAttribute());)

我的问题是,当我要填充 EntityLog 对象时,我还想用当前执行授权操作的用户的 ID 填充 UserId 字段,如果操作是匿名的,则为 null。

作为我的 Startup.cs 的一部分,我运行这个函数来配置 Audit.NET:

private void ConfigureAudit()
        {
            Audit.Core.Configuration.Setup()
                .UseEntityFramework(x => x
                    .AuditTypeMapper(t => typeof(AuditLog))
                    .AuditEntityAction<AuditLog>((ev, entry, entity) =>
                    {
                        entity.UserId = ???;
                        // other fields...
                    })
                    .IgnoreMatchedProperties()
                );
        }
Run Code Online (Sandbox Code Playgroud)

显然,此时我无法使用,HttpContext.Current.User.Identity.GetUserId()因为我不在控制器内,而且我没有看到将 UserId 传递到 Audit 事件的方法。

此时如何检索 UserId?

Ste*_* Py 0

我使用的方法是 IUserContextLocator 接口,它成为 DbContext 或任何实现审计的类的依赖项。该接口的实现是在 Web 应用程序中创建的,并通过依赖项注入进行连接,以使用构造函数初始化来提供当前会话的详细信息。以便 DbContext 或其他审核服务可以通过 IUserContextLocator 中的方法解析当前用户结构,而 IUserContextLocator 又从会话中获取。

我当前的实现正在运行,所以我没有方便的示例,但我可以明天添加它的内容。与之类似的原理可以在这里看到:http://josephwoodward.co.uk/2014/06/sessions-asp-net-mvc-using-dependency-injection/

本质上,域级代码无法访问 HttpContext.Current 等内容,但在 Web 应用程序中初始化的实现可以。通过通过您的域可以引用的通用接口在您的 DI 中注册该实现,您可以注入由 Web 应用程序提供的依赖项,从而允许您访问会话数据。此示例将其称为注册表,这可能是更准确的模式。