Контроллер веб-API ChangePasswordAsync, возвращающийся Failed: PasswordMismatch C # - PullRequest
0 голосов
/ 31 августа 2018

Я создаю приложение .net core 2 Identity. Он использует токен 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");
    }
  }

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Решил, используя:

var user = await _userManager.FindByNameAsync(...);

, затем передав это в ChangePasswordAsync

var result = await _userManager.ChangePasswordAsync(user, model.Password, model.NewPassword); 
0 голосов
/ 31 августа 2018

Ошибка {Failed: PasswordMismatch} вызвана тем, что параметр currentPassword указывает, что вы не соответствует существующему паролю против этого пользователя (второй параметр в методе), который вы отправляете как «model.Password». Метод проверяет это значение, чтобы убедиться, что пользователь является тем, кем, по его словам, он является.

public virtual Task<IdentityResult> ChangePasswordAsync(TUser user, string 
    currentPassword, string newPassword);

Я бы предложил отладку, чтобы убедиться, что вы передаете текущий пароль пользователя, а не новый пароль, и убедитесь, что вы получаете правильного пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...