Проверка токена сброса пароля не выполняется в одном методе, но работает в другом в ASP. NET Удостоверение - PullRequest
0 голосов
/ 24 марта 2020

Мы пытаемся использовать UserManager, чтобы сгенерировать PasswordResetToken и проверить его, прежде чем действительно сбросить пароль.

Первый метод отвечает за генерацию токена, который затем отправлено пользователю через ссылку для сброса пароля.
Генерация токена работает нормально, и после проверки его, VerifyUserTokenAsync возвращает true (строка: //var result = await this.userManager.VerifyUserTokenAsync(user, TokenOptions.DefaultProvider, UserManager<User>.ResetPasswordTokenPurpose, token);

Второй способ - сброс пароль. Мы не используем UserManager.ResetPassword, потому что наш пользователь не имеет всех обязательных полей. При вызове VerfiyUserTokenAsync в этом методе if возвращает false, даже если предоставленный токен точно такой же, как в первом метод.

Мы не можем понять, почему он работает в первом методе, но не работает во втором ...
Любая подсказка будет высоко оценена.

Спасибо за аванс

[HttpPost("generatepasswordresettoken")]
[ProducesResponseType(StatusCodes.Status201Created)]
public async Task<IActionResult> GeneratePasswordResetToken([FromBody] ResetPasswordTokenRequest resetPasswordTokenRequest)
{
    var user = await this.userService.GetAsync(resetPasswordTokenRequest.Email);
    var token = await this.userManager.GeneratePasswordResetTokenAsync(user);
    //var result = await this.userManager.VerifyUserTokenAsync(user, TokenOptions.DefaultProvider, UserManager<User>.ResetPasswordTokenPurpose, token);

    return this.Ok(new GenerateResetPasswordTokeResponse {ResetPasswordToken = token, Email = resetPasswordTokenRequest.Email});
}



[HttpPut("resetpassword")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status500InternalServerError)]
public async Task<IActionResult> ResetPassword([FromBody] ResetPasswordRequest resetPasswordRequest)
{
    var user = await this.userService.GetAsync(resetPasswordRequest.Email);
    if (await this.userManager.VerifyUserTokenAsync(user, TokenOptions.DefaultProvider, UserManager<User>.ResetPasswordTokenPurpose, resetPasswordRequest.ResetPasswordToken)) {
        var resetPasswordDomainModel = this.resetPasswordMapper.Map(resetPasswordRequest);
        if (await this.userService.ResetPasswordAsync(resetPasswordDomainModel)) {
            return this.Ok();
        }
    }

     return this.BadRequest("Couldn't reset password");
}

1 Ответ

0 голосов
/ 24 марта 2020

Каждый SecurityToken должен быть действителен только для одной операции, и такое поведение VerifyUserTokenAsyn c является преимуществом. В противном случае вам нужно написать некоторый код, чтобы самостоятельно контролировать это поведение. В вашем случае вы можете сгенерировать новый токен и передать его методу ResetPasswordAsyn c.

    [HttpPut("resetpassword")]
    [ProducesResponseType(StatusCodes.Status200OK)]
    [ProducesResponseType(StatusCodes.Status500InternalServerError)]
    public async Task<IActionResult> ResetPassword([FromBody] ResetPasswordRequest resetPasswordRequest)
    {
        var user = await this.userService.GetAsync(resetPasswordRequest.Email);
        if (await this.userManager.VerifyUserTokenAsync(user, TokenOptions.DefaultProvider, UserManager<User>.ResetPasswordTokenPurpose, resetPasswordRequest.ResetPasswordToken))
        {
            var newtoken = userManager.GeneratePasswordResetTokenAsync(user);
            resetPasswordRequest.ResetPasswordToken = newtoken;
            var resetPasswordDomainModel = this.resetPasswordMapper.Map(resetPasswordRequest);
            if (await this.userService.ResetPasswordAsync(resetPasswordDomainModel))
            {
                return this.Ok();
            }
        }

        return this.BadRequest("Couldn't reset password");
    }
...