我正在尝试为我的身份服务器用户实现电子邮件确认/验证功能。就我而言,我有 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); 时遇到“无效令牌”问题
我查看了他们的源代码并找到了解决方案:
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);
}
}