You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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全局获取用户名

  1. 先在依赖注入容器中注册IHttpContextAccessor(ASP.NET Core环境):
// Program.cs 或 Startup.cs
builder.Services.AddHttpContextAccessor();
  1. 在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扩展自动捕获用户信息

  1. 安装Audit.AspNetCore NuGet包:
Install-Package Audit.AspNetCore
  1. 配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 09:55:02