我正在努力确认 ASP.Net Core 6 中的电子邮件。 我正在使用 userManager.ConfirmEmailAsync 来确认我要验证的电子邮件, 最近我取消了确认令牌的编码,即使我删除了,我仍然得到无效的令牌。
这就是我创建用于确认的令牌的方式
var token = await _userManager.GenerateEmailConfirmationTokenAsync(newUser);
var confirmationLink = Url.Link("email-confirmation", new { token, inputUserModel.EmailUser });
这是为了获取代币
[HttpPost]
[AllowAnonymous]
[Route("ConfirmEmail")]
public async Task<IActionResult> ConfirmEmail(string token, string email)
{
if (token == null || email == null) return StatusCode(406, new { message = "You need to provide the informations", DateTime.Now });
var emailController = new EmailAddressAttribute();
if (!emailController.IsValid(email)) return StatusCode(406, new { message = "The information provided is not an email address.", DateTime.Now });
var user = await _userManager.FindByEmailAsync(email);
if (user == null) return NotFound( new { message = "The email you provide is not assigned to any users.", DateTime.Now });
if (await _userManager.IsEmailConfirmedAsync(user)) return StatusCode(401, new { message = "Your email is already confirmed", DateTime.Now });
var result = await _userManager.ConfirmEmailAsync(user, token);
if (result.Succeeded)
{
user.EmailConfirmed = true;
await _userManager.UpdateAsync(user);
}
return (result.Succeeded ? Ok(new { message = $"the {_dataHelper.CriptEmail(email)} is been confirmed.", DateTime.Now }) : NotFound(new { message = "The token you provide was not found.", DateTime.Now }));
}
如果您还需要其他东西,请告诉我。
附注
_dataHelper.CriptEmail
这是我为电子邮件进行软编码的方法,类似于(an\*\*\*\*@gmail.com)
我期待通过正确的建议进行确认。
接受任何形式的帮助:)
对于来到这里的任何人,仍然找不到解决方案(并检查相同的令牌),那么您可能会像我一样直率,并使用
GenerateChangeEmailTokenAsync
设置生成的令牌,而不是使用正确的方法: GenerateEmailConfirmationTokenAsync
..
这发生在我身上,我不知道为什么,但从网址读取后“+”被替换为“”。
所以我这样做了,它对我有用
token.replace(" ", "+");
导致
Invalid Token
错误的另一个可能原因可能是您执行了一些影响用户 SecurityStamp
的操作,AFTER 生成了 Email Confirmation Token
。例如,生成确认令牌后更改用户的密码。
就我而言,我正在研究重新发送电子邮件确认功能,我必须在重新发送电子邮件确认之前将用户的密码重置为自动生成的值。在更改密码之前,我已经生成了电子邮件确认令牌。一旦更改密码,用户的
SecurityStamp
就会更新。这样,当用户尝试确认电子邮件时,Microsoft.AspNetCore.Identity.DataProtectorTokenProvider[TUser].ValidateAsync
返回 false,指示令牌无效,因为它在 SecurityStamp
验证阶段失败。
DataProtectorTokenProvider
课程可以从这里参考