如何在控制器内获取UserId用于日志记录,多次调用取值方法是否存在性能问题
多次调用User.FindFirstValue获取用户ID的相关问题解答
你完全可以在单个Action内多次调用User.FindFirstValue(ClaimTypes.NameIdentifier)获取用户ID,这种写法不会引发可感知的性能问题,具体说明如下:
- 该方法本质是纯内存操作:请求的
ClaimsPrincipal携带的所有声明都是身份验证中间件在请求管道前期就解析完成并加载到内存中的,调用FindFirstValue仅会在内存的声明集合中做遍历匹配,不存在数据库查询、远程调用这类高耗时IO操作,单次调用耗时在微秒级别,即使单次Action内调用十几次,对整体请求性能的影响可以忽略不计。 - 如果你想要进一步优化代码可读性,也可以选择在Action开头将用户ID提取为局部变量复用,也能避免重复编写方法参数可能出现的拼写错误,示例如下:
// Action入口处统一提取用户ID var userId = User.FindFirstValue(ClaimTypes.NameIdentifier); // 后续所有日志记录场景直接使用userId变量即可
你选择避免在日志中记录User.Identity.Name这类敏感信息的做法符合隐私合规的要求,使用用户ID做日志关联完全可以满足问题排查的需求。
内容的提问来源于stack exchange,提问作者Анатолій Тимошенко
相关产品推荐
相关产品推荐

