C# Web API ChangePasswordAsync控制器返回失败:密码不匹配C

C# Web API ChangePasswordAsync控制器返回失败:密码不匹配C,c#,asp.net-core,asp.net-core-identity,C#,Asp.net Core,Asp.net Core Identity,我正在构建一个.NETCore2身份验证应用程序。它将JWT令牌用于Vuejs前端 我正在编写更新密码控制器,该控制器首先检查令牌,然后使用ChangePasswordAsync更改密码,但我一直收到响应: {Failed : PasswordMismatch}. 我的控制器代码如下。我已经成功地编写了登录和注册控制器,但没有这方面的运气。登录的用户ctrustUser已成功返回,因此我将使用该数据将登录的用户数据传递到ChangePasswordAsync。 请你能帮帮我吗 [Autho

我正在构建一个.NETCore2身份验证应用程序。它将JWT令牌用于Vuejs前端

我正在编写更新密码控制器,该控制器首先检查令牌,然后使用ChangePasswordAsync更改密码,但我一直收到响应:

{Failed : PasswordMismatch}.
我的控制器代码如下。我已经成功地编写了登录和注册控制器,但没有这方面的运气。登录的用户ctrustUser已成功返回,因此我将使用该数据将登录的用户数据传递到ChangePasswordAsync。 请你能帮帮我吗

  [Authorize(Policy = "ApiUser")]
  [Route("api/[controller]/[action]")]
  public class AccountsEditController : Controller
  {
    private readonly ClaimsPrincipal _caller;
    private readonly ApplicationCtrustUsersDbContext _appDbContext;
    private readonly UserManager<AppAdminUser> _userManager;
    private readonly IMapper _mapper;

    public AccountsEditController(UserManager<AppAdminUser> userManager, ApplicationCtrustUsersDbContext appDbContext, IHttpContextAccessor httpContextAccessor, IMapper mapper)
    {
      _userManager = userManager;
      _caller = httpContextAccessor.HttpContext.User;
      _appDbContext = appDbContext;
      _mapper = mapper;
    }

    // POST api/accountsedit/updatepassword
    [HttpPost]
    public async Task<IActionResult>UpdatePassword([FromBody]UpdatePasswordViewModel model)
    {
      // simulate slightly longer running operation to show UI state change
      await Task.Delay(250);

      if (!ModelState.IsValid)
      {
        return BadRequest(ModelState);
      }

      // retrieve the user info
      var userId = _caller.Claims.Single(c => c.Type == "id");
      var ctrustUser = await _appDbContext.CtrustUser.Include(c => c.Identity).SingleAsync(c => c.Identity.Id == userId.Value);

      AppAdminUser userIdentity = new AppAdminUser();

      userIdentity.Id = ctrustUser.IdentityId;
      userIdentity.UserName = ctrustUser.Identity.UserName;
      userIdentity.Email = ctrustUser.Identity.Email;

      //AppAdminUser user = _mapper.Map<AppAdminUser>(model);

      var result = await _userManager.ChangePasswordAsync(userIdentity, model.Password, model.NewPassword);

      if (!result.Succeeded) return new BadRequestObjectResult(Errors.AddErrorsToModelState(result, ModelState));

      return new OkObjectResult("Password updated");
    }
  }

错误{Failed:PasswordMismatch}是由于您传入的currentPassword参数与该用户的现有密码不匹配,这是您作为model.password发送的方法中的第二个参数。该方法验证该值以确保用户是他们所说的用户

公共虚拟任务ChangePasswordAsyncTUser用户,字符串 currentPassword,字符串newPassword; 我建议进行调试,以确保您传入的是用户的当前密码,而不是他们的新密码,并确保您检索的是正确的用户。

通过使用以下方法解决了此问题:

var user = await _userManager.FindByNameAsync(...);
然后将其传递到ChangePasswordAsync

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

解决方法是使用var user=await\u userManager.FindByNameAsync,然后将其传递到ChangePasswordAsync var result=await\u userManager.ChangePasswordAsyncuser,model.Password,model.NewPassword;所以,是的,你的评论帮助我朝着正确的方向前进。非常感谢。