电子邮件确认令牌在 Identity Server 中不起作用

问题描述 投票:0回答:1

我正在尝试为我的身份服务器用户实现电子邮件确认/验证功能。就我而言,我有 2 个应用程序,一个用于 Web API 添加身份服务器用户,另一个用于 Web 应用程序以向用户提供登录信息。

我已遵循此文档并能够生成用于用户电子邮件确认的令牌。在这里,我正在为身份 Web 应用程序形成一个 URL,并附加令牌、电子邮件作为查询参数。

var token = await _userManager.GenerateEmailConfirmationTokenAsync(user);
var confirmationLink = Url.Action(nameof(ConfirmEmail), "Account", new { token, email = user.Email }, Request.Scheme);
var message = new Message(new string[] { user.Email }, "Confirmation email link", confirmationLink, null);
await _emailSender.SendEmailAsync(message);

使用上面的代码生成与此类似的 URL。

https://identitywebapp/Account/ConfirmEmail?token=CfDJ8MnpbdKNEB1Orar2rO6jqk3aK1mqnU9i%2BbAkMbV7Bpu91NhOGVCv8ad4x8pFw8tzRPrixaJNJPMsQVXhBxywNdZvCsN0PiqXZJxem45JblNQEy4gaMVDeFgu8wlGIBtXwi&[email protected]

下面是我的 ConfirmEmail 方法实现。

[HttpGet]
public async Task<IActionResult> ConfirmEmail(string token, string email)
{
    var user = await _userManager.FindByEmailAsync(email);
    if (user == null)
        return View("Error");
    var result = await _userManager.ConfirmEmailAsync(user, token);
    return View(result.Succeeded ? nameof(ConfirmEmail) : "Error");
}

我在调用 _userManager.ConfirmEmailAsync(user, token); 时遇到“无效令牌”问题

asp.net-identity identityserver4 duende-identity-server
1个回答
0
投票

我查看了他们的源代码并找到了解决方案:

public async Task<bool> VerifyResetEmailTokenAsync(string email, string newEmail, string token) {
    var user = await _userManager.FindByEmailAsync(email);

    var isValidToken = await _userManager.VerifyUserTokenAsync(
        user,
        _userManager.Options.Tokens.ChangeEmailTokenProvider,
        $"ChangeEmail:{newEmail}",
        token
    );

    return isValidToken;
}

public async Task<string> GenerateEmailChangeTokenAsync(Guid userId, string newEmail) {
    var user = await _userManager.FindByIdAsync(userId.ToString());

    try {
        var token = await _userManager.GenerateChangeEmailTokenAsync(user, newEmail);
        return token;
    }
    catch (Exception ex) {
        // Handle the exception (log, rethrow, or return a specific error message)
        throw new Exception("Failed to generate email change token.", ex);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.