如何为Audit.NET日志配置正确的登录用户名?
在Audit.NET配置中获取系统登录用户名的解决方案
方法一:通过AuditScope自定义字段传递用户名
在触发审计的业务代码里,创建AuditScope时将当前登录用户信息存入自定义字段:
// 控制器或服务中(需能访问到User对象) using (var scope = AuditScope.Create("操作名称", () => 目标实体, new { CreatedBy = User.FindFirstValue(ClaimTypes.Name) })) { // 执行你的业务操作(如保存实体) }
然后在Audit.NET全局配置中,从审计事件的CustomFields读取用户名:
Configuration.Setup() .UseEntityFramework(_ => _ .AuditTypeMapper(t => typeof(AuditLog)) .AuditEntityAction<AuditLog>((ev, entry, entity) => { entity.AuditData = entry.ToJson(); entity.TableName = entry.EntityType.Name; entity.CreatedDate = DateTime.Now; // 优先取自定义字段的用户名,兜底用Windows用户名 entity.CreatedBy = ev.CustomFields["CreatedBy"]?.ToString() ?? Environment.UserName; entity.TablePK = entry.PrimaryKey.First().Value.ToString(); }) .IgnoreMatchedProperties(true));
方法二:通过HttpContextAccessor全局获取用户名
- 先在依赖注入容器中注册
IHttpContextAccessor(ASP.NET Core环境):
// Program.cs 或 Startup.cs builder.Services.AddHttpContextAccessor();
- 在Audit.NET配置时,获取
IHttpContextAccessor实例并读取当前用户信息:
// 需确保此处能获取到ServiceProvider实例,比如在Program.cs配置阶段 var httpContextAccessor = builder.Services.BuildServiceProvider().GetRequiredService<IHttpContextAccessor>(); Configuration.Setup() .UseEntityFramework(_ => _ .AuditTypeMapper(t => typeof(AuditLog)) .AuditEntityAction<AuditLog>((ev, entry, entity) => { entity.AuditData = entry.ToJson(); entity.TableName = entry.EntityType.Name; entity.CreatedDate = DateTime.Now; // 从HttpContext读取用户名,无上下文时兜底 var userName = httpContextAccessor.HttpContext?.User?.FindFirstValue(ClaimTypes.Name) ?? Environment.UserName; entity.CreatedBy = userName; entity.TablePK = entry.PrimaryKey.First().Value.ToString(); }) .IgnoreMatchedProperties(true));
方法三:使用Audit.AspNetCore扩展自动捕获用户信息
- 安装
Audit.AspNetCoreNuGet包:
Install-Package Audit.AspNetCore
- 配置Audit.NET时启用AspNetCore扩展,自动包含用户信息:
builder.Services.AddAuditNet(config => { config.UseEntityFramework(_ => _ .AuditTypeMapper(t => typeof(AuditLog)) .AuditEntityAction<AuditLog>((ev, entry, entity) => { entity.AuditData = entry.ToJson(); entity.TableName = entry.EntityType.Name; entity.CreatedDate = DateTime.Now; // 从审计事件扩展属性读取自动捕获的用户名 entity.CreatedBy = ev.ExtendedProperties["UserName"]?.ToString() ?? Environment.UserName; entity.TablePK = entry.PrimaryKey.First().Value.ToString(); }) .IgnoreMatchedProperties(true)); // 启用AspNetCore扩展,自动捕获用户名和HttpContext信息 config.WithAspNetCore(_ => _ .IncludeUserName() .IncludeHttpContext()); });
注意事项
- 针对无HttpContext的场景(如后台定时任务),必须保留
Environment.UserName作为兜底值,避免空引用异常。 - 方法三是官方推荐的ASP.NET Core集成方式,无需手动传递或获取HttpContext,更简洁可靠。
内容的提问来源于stack exchange,提问作者Aishwarya
相关产品推荐
相关产品推荐

