在控制器中获取当前用户

Getting Current User in Controller

希望有人能帮我解决这个问题。我正在尝试在帐户控制器中创建更改密码 Post 请求,但我的用户始终返回 null。我是 .NET 的新手,有人可以帮我找出检索当前用户 ID 的最佳方法吗?这是我到目前为止的代码。

[HttpPost("changePassword")]
    public async Task<ActionResult<ChangePasswordDTO>> ChangePassword([FromBody] ChangePasswordDTO changePassword) {

        var currentUserId = User.Claims.ToList()
        .FirstOrDefault(x => x.Type == "").Value;

         var user = await _userManager.FindByIdAsync(currentUserId);

        var result = await _userManager.ChangePasswordAsync(user, changePassword.Password, changePassword.NewPassword);

        if (result.Succeeded) {
            return Ok("Password changed succesfully");
        } else return Unauthorized("An error occurred while attempting to change password");


    }

当然,当我将“currentUserId”更改为硬编码值时,一切正常。每个用户都有一个生成的 jwt 令牌,其中包含他的姓名、ID、角色等。我不确定如何继续,我尝试过的所有操作都将用户检索为 null。如果您需要额外的信息,请告诉我,我对这一切都很陌生,感谢我能得到的任何帮助,谢谢!

解决方案

JamesS 为我指出了正确的方向,这段代码有效:

var currentUserId =this.User.FindFirstValue(ClaimTypes.NameIdentifier);

您可以使用 UserManager 在您的控制器中获取当前用户 ID,例如:

ASP.NET 核心 >= 2.0

var currentUserId = User.FindFirstValue(ClaimTypes.NameIdentifier);

Name使用:

var currentUserId = User.FindFirstValue(ClaimTypes.Name);

如果你想在其他 class 中获取当前用户,你可以使用 IHttpContextAccessor,将其传递到 class 的构造函数并使用 HttpContext 访问 User