# ASP.NET Core 审计
**本文档中引用的文件**
- [AbpAspNetCoreAuditingModule.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AbpAspNetCoreAuditingModule.cs)
- [AspNetCoreRecordHeaderAuditLogContributor.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AspNetCoreRecordHeaderAuditLogContributor.cs)
- [AbpAspNetCoreAuditingHeaderOptions.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AbpAspNetCoreAuditingHeaderOptions.cs)
- [AbpAuditLoggingModule.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging/LINGYUN/Abp/AuditLogging/AbpAuditLoggingModule.cs)
- [DefaultAuditLogManager.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging/LINGYUN/Abp/AuditLogging/DefaultAuditLogManager.cs)
- [AuditLogManager.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.EntityFrameworkCore/LINGYUN/Abp/AuditLogging/EntityFrameworkCore/AuditLogManager.cs)
- [AuditLogAppService.cs](file://aspnet-core/modules/auditing/LINGYUN.Abp.Auditing.Application/LINGYUN/Abp/Auditing/AuditLogs/AuditLogAppService.cs)
- [AuditLogController.cs](file://aspnet-core/modules/auditing/LINGYUN.Abp.Auditing.HttpApi/LINGYUN/Abp/Auditing/AuditLogs/AuditLogController.cs)
- [README.md](file://aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/README.md)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构概述](#架构概述)
5. [详细组件分析](#详细组件分析)
6. [依赖分析](#依赖分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
## 简介
LINGYUN.Abp.AspNetCore.Auditing 模块是 ABP 框架中用于 ASP.NET Core 应用程序的审计功能扩展。该模块专注于在审计日志中记录 HTTP 请求头信息,为开发者提供了一种灵活的方式来监控和分析应用程序的 HTTP 通信。通过该模块,开发者可以配置哪些 HTTP 请求头需要被记录,并在审计日志中查看这些信息,从而更好地理解客户端与服务器之间的交互。
## 项目结构
该模块位于 `aspnet-core/framework/auditing` 目录下,主要包含 ASP.NET Core 审计相关的功能实现。模块通过 `AbpAspNetCoreAuditingModule` 类进行注册和配置,利用 `AspNetCoreRecordHeaderAuditLogContributor` 贡献者来收集 HTTP 请求头信息。审计数据的存储和管理由 `AbpAuditLogging` 模块负责,该模块提供了多种数据存储选项,包括 Entity Framework Core 和 Elasticsearch。
```mermaid
graph TD
subgraph "审计模块"
A[AbpAspNetCoreAuditingModule]
B[AspNetCoreRecordHeaderAuditLogContributor]
C[AbpAspNetCoreAuditingHeaderOptions]
end
subgraph "审计日志模块"
D[AbpAuditLoggingModule]
E[DefaultAuditLogManager]
F[AuditLogManager]
end
A --> B
B --> C
D --> E
D --> F
B --> D
```
**图源**
- [AbpAspNetCoreAuditingModule.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AbpAspNetCoreAuditingModule.cs)
- [AspNetCoreRecordHeaderAuditLogContributor.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AspNetCoreRecordHeaderAuditLogContributor.cs)
- [AbpAspNetCoreAuditingHeaderOptions.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AbpAspNetCoreAuditingHeaderOptions.cs)
- [AbpAuditLoggingModule.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging/LINGYUN/Abp/AuditLogging/AbpAuditLoggingModule.cs)
- [DefaultAuditLogManager.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging/LINGYUN/Abp/AuditLogging/DefaultAuditLogManager.cs)
- [AuditLogManager.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging.EntityFrameworkCore/LINGYUN/Abp/AuditLogging/EntityFrameworkCore/AuditLogManager.cs)
**节源**
- [AbpAspNetCoreAuditingModule.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AbpAspNetCoreAuditingModule.cs)
- [AbpAuditLoggingModule.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging/LINGYUN/Abp/AuditLogging/AbpAuditLoggingModule.cs)
## 核心组件
LINGYUN.Abp.AspNetCore.Auditing 模块的核心组件包括 `AbpAspNetCoreAuditingModule`、`AspNetCoreRecordHeaderAuditLogContributor` 和 `AbpAspNetCoreAuditingHeaderOptions`。`AbpAspNetCoreAuditingModule` 是模块的主类,负责在应用程序启动时注册审计功能。`AspNetCoreRecordHeaderAuditLogContributor` 是一个审计日志贡献者,它在审计日志创建前收集 HTTP 请求头信息。`AbpAspNetCoreAuditingHeaderOptions` 则提供了配置选项,允许开发者指定哪些 HTTP 请求头需要被记录。
**节源**
- [AbpAspNetCoreAuditingModule.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AbpAspNetCoreAuditingModule.cs)
- [AspNetCoreRecordHeaderAuditLogContributor.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AspNetCoreRecordHeaderAuditLogContributor.cs)
- [AbpAspNetCoreAuditingHeaderOptions.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AbpAspNetCoreAuditingHeaderOptions.cs)
## 架构概述
该模块的架构设计遵循了 ABP 框架的模块化原则。`AbpAspNetCoreAuditingModule` 依赖于 `AbpAspNetCoreModule`,确保在 ASP.NET Core 应用程序中正确集成审计功能。`AspNetCoreRecordHeaderAuditLogContributor` 实现了 `AuditLogContributor` 接口,通过 `PreContribute` 方法在审计日志创建前收集 HTTP 请求头信息。这些信息随后被存储在 `AuditLogInfo` 对象的 `ExtraProperties` 中,最终由 `AbpAuditLogging` 模块处理和存储。
```mermaid
sequenceDiagram
participant App as 应用程序
participant Module as AbpAspNetCoreAuditingModule
participant Contributor as AspNetCoreRecordHeaderAuditLogContributor
participant Options as AbpAspNetCoreAuditingHeaderOptions
participant Audit as AbpAuditLoggingModule
App->>Module : 启动
Module->>Module : 配置服务
Module->>Audit : 添加贡献者
Audit->>Contributor : 创建实例
loop 每个HTTP请求
App->>Contributor : 开始审计
Contributor->>Options : 获取配置
Contributor->>App : 获取HTTP上下文
Contributor->>Contributor : 收集请求头
Contributor->>Audit : 设置审计信息
end
```
**图源**
- [AbpAspNetCoreAuditingModule.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AbpAspNetCoreAuditingModule.cs)
- [AspNetCoreRecordHeaderAuditLogContributor.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AspNetCoreRecordHeaderAuditLogContributor.cs)
- [AbpAspNetCoreAuditingHeaderOptions.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AbpAspNetCoreAuditingHeaderOptions.cs)
- [AbpAuditLoggingModule.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging/LINGYUN/Abp/AuditLogging/AbpAuditLoggingModule.cs)
## 详细组件分析
### AspNetCoreRecordHeaderAuditLogContributor 分析
`AspNetCoreRecordHeaderAuditLogContributor` 是该模块的核心实现类,负责收集 HTTP 请求头信息。它通过 `IHttpContextAccessor` 获取当前 HTTP 上下文,并根据 `AbpAspNetCoreAuditingHeaderOptions` 的配置决定是否记录请求头。如果配置允许,它会遍历指定的请求头名称,从 `HttpRequest.Headers` 中获取相应的值,并将它们存储在审计信息的 `ExtraProperties` 中。
```mermaid
flowchart TD
Start([开始]) --> CheckEnabled["检查是否启用"]
CheckEnabled --> |否| End([结束])
CheckEnabled --> |是| GetContext["获取HTTP上下文"]
GetContext --> CheckContext["检查上下文是否存在"]
CheckContext --> |否| End
CheckContext --> |是| CheckProperty["检查是否已存在属性"]
CheckProperty --> |是| End
CheckProperty --> |否| CollectHeaders["收集请求头"]
CollectHeaders --> StoreData["存储数据到审计信息"]
StoreData --> End
```
**图源**
- [AspNetCoreRecordHeaderAuditLogContributor.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AspNetCoreRecordHeaderAuditLogContributor.cs)
- [AbpAspNetCoreAuditingHeaderOptions.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AbpAspNetCoreAuditingHeaderOptions.cs)
**节源**
- [AspNetCoreRecordHeaderAuditLogContributor.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AspNetCoreRecordHeaderAuditLogContributor.cs)
### 配置选项分析
`AbpAspNetCoreAuditingHeaderOptions` 类提供了两个主要的配置选项:`IsEnabled` 和 `HttpHeaders`。`IsEnabled` 是一个布尔值,用于控制是否在审计日志中记录 HTTP 请求头,默认值为 `true`。`HttpHeaders` 是一个字符串列表,用于指定需要记录的 HTTP 请求头名称。开发者可以通过依赖注入在应用程序中配置这些选项,从而灵活地控制审计日志的内容。
**节源**
- [AbpAspNetCoreAuditingHeaderOptions.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AbpAspNetCoreAuditingHeaderOptions.cs)
## 依赖分析
该模块依赖于 ABP 框架的核心模块 `AbpAspNetCoreModule`,以确保在 ASP.NET Core 应用程序中正确集成。同时,它还依赖于 `AbpAuditLogging` 模块来处理审计日志的存储和管理。`AspNetCoreRecordHeaderAuditLogContributor` 依赖于 `IHttpContextAccessor` 来获取 HTTP 上下文,以及 `IOptions` 来获取配置信息。这些依赖关系通过构造函数注入实现,确保了组件之间的松耦合。
```mermaid
graph TD
A[AbpAspNetCoreAuditingModule] --> B[AbpAspNetCoreModule]
A --> C[AbpAuditLoggingModule]
D[AspNetCoreRecordHeaderAuditLogContributor] --> E[IHttpContextAccessor]
D --> F[IOptions]
C --> G[DefaultAuditLogManager]
C --> H[AuditLogManager]
```
**图源**
- [AbpAspNetCoreAuditingModule.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AbpAspNetCoreAuditingModule.cs)
- [AspNetCoreRecordHeaderAuditLogContributor.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AspNetCoreRecordHeaderAuditLogContributor.cs)
- [AbpAuditLoggingModule.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging/LINGYUN/Abp/AuditLogging/AbpAuditLoggingModule.cs)
**节源**
- [AbpAspNetCoreAuditingModule.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AbpAspNetCoreAuditingModule.cs)
- [AspNetCoreRecordHeaderAuditLogContributor.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AspNetCoreRecordHeaderAuditLogContributor.cs)
- [AbpAuditLoggingModule.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AuditLogging/LINGYUN/Abp/AuditLogging/AbpAuditLoggingModule.cs)
## 性能考虑
该模块在设计时考虑了性能影响。首先,它只在配置启用时才收集 HTTP 请求头信息,避免了不必要的性能开销。其次,它只收集指定的请求头,而不是所有请求头,进一步减少了数据量。最后,审计日志的存储和处理由 `AbpAuditLogging` 模块异步完成,不会阻塞主请求处理流程。然而,开发者仍需注意,记录大量请求头信息可能会增加数据库存储和网络传输的负担,因此应根据实际需求谨慎配置。
## 故障排除指南
如果审计日志中没有记录预期的 HTTP 请求头信息,首先应检查 `AbpAspNetCoreAuditingHeaderOptions` 的配置是否正确,特别是 `IsEnabled` 是否为 `true` 以及 `HttpHeaders` 是否包含需要记录的请求头名称。其次,确保 `AbpAspNetCoreAuditingModule` 已在应用程序模块中正确引用。如果问题仍然存在,可以启用详细的日志记录来调试 `AspNetCoreRecordHeaderAuditLogContributor` 的执行过程。
**节源**
- [AbpAspNetCoreAuditingHeaderOptions.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AbpAspNetCoreAuditingHeaderOptions.cs)
- [AspNetCoreRecordHeaderAuditLogContributor.cs](file://aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AspNetCoreRecordHeaderAuditLogContributor.cs)
## 结论
LINGYUN.Abp.AspNetCore.Auditing 模块为 ABP 框架的 ASP.NET Core 应用程序提供了一个灵活且高效的 HTTP 请求头审计解决方案。通过简单的配置,开发者可以轻松地记录和分析应用程序的 HTTP 通信,从而提高系统的可观察性和安全性。该