IdentityServer4 ResetPasswordAsync始终返回InvalidToken

时间:2019-12-13 13:10:00

标签: asp.net-core asp.net-identity identityserver4

我已经用IdentityServer4设置了dotnetcore3 Angular模板,但是遇到了问题。用户注册和登录有效,但是,每当我尝试重设密码时,提交ForgotPassword表单(作为模板的一部分提供)时,都会从_userManager.ResetPasswordAsync收到InvalidToken错误。

这是该方法的代码(我相信模板中的代码不变:

public async Task<IActionResult> OnPostAsync()
{
    if (!ModelState.IsValid)
    {
        return Page();
    }

    var user = await _userManager.FindByEmailAsync(Input.Email);
    if (user == null)
    {
        // Don't reveal that the user does not exist
        return RedirectToPage("./ResetPasswordConfirmation");
    }

    var result = await _userManager.ResetPasswordAsync(user, Input.Code, Input.Password);
    if (result.Succeeded)
    {
        return RedirectToPage("./ResetPasswordConfirmation");
    }

    foreach (var error in result.Errors)
    {
        ModelState.AddModelError(string.Empty, error.Description);
    }
    return Page();
}

以下是生成带有令牌的电子邮件的代码:

 public async Task<IActionResult> OnPostAsync()
    {
      if (ModelState.IsValid)
      {
        var user = await _userManager.FindByEmailAsync(Input.Email);
        if (user == null || !(await _userManager.IsEmailConfirmedAsync(user)))
        {
          // Don't reveal that the user does not exist or is not confirmed
          // For more information on how to enable account confirmation and password reset please
          // visit https://go.microsoft.com/fwlink/?LinkID=532713
          var code = await _userManager.GeneratePasswordResetTokenAsync(user);
          code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
          var callbackUrl = Url.Page(
              "/Account/ResetPassword",
              pageHandler: null,
              values: new { area = "Identity", code },
              protocol: Request.Scheme);

          await _emailSender.SendEmailAsync(
              Input.Email,
              "Reset Password",
              $"Please reset your password by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");


        }
        return RedirectToPage("./ForgotPasswordConfirmation");

      }

      return Page();
    }

我也在使用默认令牌提供程序:

services.AddIdentity<ApplicationUser, IdentityRole>(options => {
        options.Tokens.PasswordResetTokenProvider = TokenOptions.DefaultEmailProvider;
        options.Tokens.EmailConfirmationTokenProvider = TokenOptions.DefaultEmailProvider;
      })
      .AddDefaultTokenProviders()
      .AddEntityFrameworkStores<ApplicationDbContext>();

不知道它是否相关,但是我的服务器上有一个自签名证书(并且它不起作用),并且我在本地运行时使用了开发证书(这也不起作用)。

0 个答案:

没有答案