审计日志查询页(Aegis.Security.AuditLog.UI)
审计日志的内置综合查询页。装上这个包、在组件清单里声明一行,浏览器打开 /auditlog-ui 就能查审计:按领域、子域、动作、时间、操作人、关键词、级别、操作对象任意组合筛选,批量操作折叠成一条汇总行,点开看明细。页面和配套端点打包在组件里,不用写前端代码。
组件概览
| 项 | 说明 |
|---|---|
| 组件名称 | Security.AuditLog.UI(NuGet 包 Aegis.Security.AuditLog.UI) |
| 真实类库 | 独立包,引用它即得查询页;不装也不影响审计的写入和代码查询 |
| 定位 | 审计查询能力的开箱即用形态:自带的查询界面 + 配套查询端点 |
| 引入方式 | 引用包 + Component.deps.json 的 Load 数组加 "Security.AuditLog.UI",无其它配置 |
| 依赖组件 | Security.AuditLog.FreeSql(声明后自动带上,查询走 FreeSql 实现) |
| 核心能力 | /auditlog-ui 查询页、/auditlog-ui/api/search 综合查询、/auditlog-ui/api/vocabulary 词表元数据、/auditlog-ui/api/group 组展开、/auditlog-ui/api/payload 报文附件直取 |
什么时候要用它
适合:
- 要一个能查审计的后台页面,但不想自己开发前端
- 运维、管理员这类非开发角色需要临时排查"谁改的、谁看的"
- 项目初期先上自带页面,之后有精力再做定制查询屏
不适合:
- 公网或不受信任网络下直接暴露查询页的系统(页面和端点当前匿名可访问,见下面提示)
- 要深度定制交互(保存常用筛选、导出报表)的场景,参照 BaseDemo 的
AuditQueryDemoService注入IAuditQuery自建
页面和四个 API 端点都按匿名挂载(组件定位是内网工具)。审计数据含患者轨迹等敏感信息,报文附件更是接口原文,应用部署到公网或不受信任的网络时,用网关或反向代理把 /auditlog-ui 路径挡在认证后面。
最小可运行路径
第一步:引用包
dotnet add package Aegis.Security.AuditLog.UI
前提是审计日志已按主手册接好(FreeSql 存储方 + AddAuditLog<业务数据源>())。查询页依赖 Security.AuditLog.FreeSql,组件声明后会自动带上。
第二步:声明组件
Component.deps.json 的 Load 数组加一行:
{
"Components": {
"Load": [
"Security.AuditLog.FreeSql",
"Security.AuditLog.UI"
]
}
}
第三步:启动并打开页面
启动应用(无新增配置项),浏览器打开:
http://<应用地址>/auditlog-ui
页面打开就能查。筛选下拉的领域、子域、动作、对象类型来自应用里声明的审计词表,和写入侧用的是同一个注册表。
打开后的第一屏如图 1:最上面一行是主筛选(时间范围一体控件、操作人、关键词、级别)和"查询/重置/更多筛选"按钮;下面是记录列表,批量操作折叠成一条汇总行(带"组 3/3"徽标的那行),非批量记录一行一条。
图 1:查询页第一屏(v3.1.4-preview2)
低频条件收在"更多筛选"里,点开后如图 2:领域 → 子域 → 动作逐级收窄(不选领域时动作下拉列全部动作);"对象标识"输入框只有在选了对象类型之后才出现(图中淡红底标注),避免无意义的空输入。
图 2:更多筛选展开——三级联动与按需出现的对象标识(v3.1.4-preview2)
页面能做什么
| 能力 | 说明 |
|---|---|
| 领域/子域/动作三级联动 | 选了领域,子域和动作跟着收窄;动作也可以不选领域单独选 |
| 时间范围 | 24 小时制(yyyy-MM-dd HH:mm:ss),默认最近 7 天(起点 00:00 到当天 23:59);填的是本机时间,服务端转成 UTC 再查 |
| 操作人 | 按操作人编号精确匹配(如 D-3001) |
| 关键词 | 搜审计句和备注(sentence ∪ note),至少 2 个字符 |
| 级别 | 全部 / 普通(Normal)/ 关键(Critical) |
| 操作对象 | 先选对象类型(词表实体),选了才出现标识输入框;两个都填才生效 |
| 已选条件回显 | 当前筛选显示成标签,点标签上的 × 删掉该条件并立即重查 |
| 组折叠 | 列表默认一条汇总行代表一次批量操作(如"转科回写共 32 条"),点汇总行的"展开"在其下方插入该组全部明细 |
| 详情抽屉 | 点行尾"详情"出抽屉:变更明细(旧值→新值)、关联对象、上下文(来源系统/调用方/终端/IP/请求标识)分区展示 |
| 报文附件面板 | 记录带报文时(写入侧调过 .Payload(...))抽屉多一个"报文附件"区,打开抽屉时按需拉取:原文、字节数、SHA-256 哈希;没收到响应的一侧标注"响应缺席:未收到" |
| 服务端分页 | 每页 20/50/100/200 条可选,翻页在服务端完成 |
条件之间是与的关系;动作多选内部是或的关系。和 IAuditQuery 的链式条件同一套语义——查询页背后就是 fluent 查询的字符串入口。
查完之后,生效的条件逐个回显在表格上方(图 3):改哪个删哪个,点标签上的 × 删掉该条件立即重查,"清空全部"一次还原;筛选下拉有值时右侧浮出 × 清除按钮,不用翻回"全部××"。
图 3:已选条件回显——删一个重查一个(v3.1.4-preview2)
批量操作在列表里只占一条汇总行。点汇总行的"展开"(图 4,红框行),该组全部明细按写入顺序插到它下方(灰底子行),每条明细有自己的操作人、宾语和审计句——"本次转科回写共 3 条,成功 3 条"是组的事实,明细是每个人的事实。
图 4:组展开——一条汇总行代表整组(v3.1.4-preview2)
点行尾"详情"打开右侧抽屉(图 5):基本信息、操作人、所属组、变更明细(旧值划线 → 新值绿色,图中淡红底区)、关联对象、上下文分区呈现,一条记录的全貌一屏读完。
图 5:详情抽屉——分区呈现一条记录的全貌(v3.1.4-preview2)
记录带报文附件时(HasPayload 为 true,写入侧调过 .Payload(...)),抽屉自动多出"报文附件"区:打开抽屉时才按需调 /auditlog-ui/api/payload?recordId=... 拉原文(列表本身只带标记不拉大字段),请求/响应各自显示原文、UTF-8 字节数和 SHA-256 哈希。传 null 的一侧不空着——标注"响应缺席:未收到(超时或失败)",没收到响应和完整交互在界面上分得开。报文怎么写入、传 null 的含义见主手册报文附件一节。
配套端点
页面用四个端点工作,也可以直接调它们做二次开发(参数错误返回 400,消息是中文,可直接展示):
| 端点 | 方法 | 用途 |
|---|---|---|
/auditlog-ui/api/search | POST | 综合查询。请求体含时间起止、操作人、领域码、子域码、动作码集合、级别集合、关键词、对象类型码、对象标识、是否折叠组(默认 true)、页码与页大小。结果每条带 hasPayload 标记 |
/auditlog-ui/api/vocabulary | GET | 词表元数据:领域、子域、动作(含所属领域与级别)、对象类型,做筛选下拉的数据源 |
/auditlog-ui/api/group?groupId=... | GET | 组展开:返回组头加全部明细,按写入顺序排列 |
/auditlog-ui/api/payload?recordId=... | GET | 报文附件直取:返回该记录的 AuditPayload(请求/响应原文、哈希、字节数、算法标识),没挂过报文返回 null |
接入后怎么确认生效
- 启动横幅里
Security.AuditLog.UI装配成功(依赖的Security.AuditLog.FreeSql一并在列) - 浏览器打开
/auditlog-ui,页面标题是"审计日志查询" - 筛选下拉能列出词表里声明的领域和动作;下拉是空的说明词表还没加载,先检查主组件接入
- 用主手册的场景接口造几条审计,页面按时间范围查出来,批量操作显示为一条汇总行,点"展开"看到逐条明细
- 业务代码写一条带
.Payload(request, response)的审计记录,该记录详情抽屉出现"报文附件"区,能看到请求/响应原文与哈希
常见问题
打开 /auditlog-ui 返回 404
两种可能:Component.deps.json 的 Load 数组没加 "Security.AuditLog.UI";或者宿主不是 ASP.NET Core 最小宿主(组件在中间件阶段补端点,需要端点路由支持,不支持的宿主启动横幅会报失败并说明原因)。
列表里找不到批量操作的逐条明细
列表默认折叠组:一次批量操作只占一条汇总行。点汇总行的"展开"在该行下方插入整组明细(详情抽屉里同样能看到逐条内容);这是服务端分页下的刻意设计,避免一次回写几百条把列表刷满。
时间条件填了不生效
时间格式必须是 yyyy-MM-dd HH:mm:ss(24 小时制)。只填日期不填时刻也能解析,但页面上的时间框按完整格式校验;填错格式查询会返回 400,页面提示具体原因。
详情抽屉里没有"报文附件"区
按记录逐条判断,不是全局开关。该记录写入时没调 .Payload(...)(HasPayload 为 false)就没有这个区——审计默认不记输入输出,调了才记。另一种情况是手工建表现场:Audit:AutoCreateTable=false 且没手工建 audit_payload 表,所有记录的 HasPayload 都是 false(启动日志里有对应告警),按主手册建表后恢复。
配套阅读
- 审计日志(Aegis.Security.AuditLog):主手册(词表定义、写入用法、查询规则、配置项)
- FreeSql 数据访问(Aegis.Core.FreeSql):数据源与查询实现所在包
- 源码 README:
src/Security/Aegis.Security.AuditLog.UI/README.md