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

ASP.NET中使用NLog正确输出用户名的问题咨询

问题根因

你遇到的两个问题都和当前使用的${identity} NLog布局渲染器的默认规则直接相关:

  • ${identity}默认输出格式为{认证状态}:{认证类型}:{用户名},未认证时输出notauth::,已认证时输出auth:认证方案名:用户名,这就是日志出现多余前缀的原因
  • 登录请求执行时,ASP.NET的User.Identity是从当前请求携带的Cookie解析的,登录操作只是给响应写入新的认证Cookie,当前请求的User.Identity不会同步更新,所以登录时打日志无法自动获取到刚登录的用户名,会显示notauth

解决方案

步骤1:修改NLog配置解决用户名带前缀问题

将NLog.config中file目标的layout属性里的${identity}替换为${identity:name=true},该参数会让渲染器只输出用户名部分,不携带认证状态和认证类型前缀。如果需要兼容登录场景手动传入的用户名,可以进一步修改配置,优先读取日志事件携带的自定义UserName属性,属性为空时再取当前登录用户名,未登录默认显示notauth:

原配置行:

layout="[${longdate}] [${uppercase:${level}}] [${logger}] ${message} ${exception:format=tostring}|user: ${identity}"

修改后配置行:

layout="[${longdate}] [${uppercase:${level}}] [${logger}] ${message} ${exception:format=tostring}|user: ${event-properties:item=UserName:whenEmpty=${identity:name=true:whenEmpty=notauth}}"

步骤2:解决登录操作日志用户名显示notauth问题

登录请求上下文无法自动获取刚登录的用户名,只需要在账号密码校验成功后,打登录日志时手动传入UserName属性即可:

// 账号密码校验逻辑完成,确认用户名合法后
var loginUserName = "admin"; // 实际替换为用户提交的用户名变量
// 打日志时附加UserName属性
_logger.WithProperty("UserName", loginUserName).Information("{UserName} Logged in.", loginUserName);
// 再执行SignInAsync登录操作
await SignInManager.SignInAsync(...);

修改完成后两个问题均可解决:非登录场景的日志自动读取当前登录用户名,无多余前缀;登录操作日志可以正常显示当前登录的用户名。

内容的提问来源于stack exchange,提问作者max

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:18:02