Подтверждение по электронной почте - странное поведение
У кого-нибудь есть идея, почему это происходит со мной?
В этом случае "результатом" будет "Успех":
public async Task<IActionResult> TestConfirmInSameRequest(string userId)
{
var user = await this._userManager.FindByIdAsync(userId);
var code = await this._userManager.GenerateEmailConfirmationTokenAsync(user);
var result = await this._userManager.ConfirmEmailAsync(user, code);
var newLocation = ...
return Redirect(newLocation);
}
И в этом случае "result" всегда равен "InvalidToken" (даже когда я вручную копирую исходный код и проверяю его)
public async Task<IActionResult> ConfirmEmail(string userId, string code)
{
var user = await this._userManager.FindByIdAsync(userId);
var result = await this._userManager.ConfirmEmailAsync(user, code);
var newLocation = ...;
return Redirect(newLocation);
}
protected async Task SendConfirmationEmail(string userId, bool originMobile)
{
var user = await this._userManager.FindByIdAsync(userId);
var code = await this._userManager.GenerateEmailConfirmationTokenAsync(user);
var encodedCode = HttpUtility.UrlEncode(code);
var callbackUrl = $"https://.../api/account/confirmemail?userId={userId}&code={encodedCode}";
await this._userService.SendConfirmationEmailAsync(userId, callbackUrl);
}
1 ответ
При отправке (SendConfirmationEmail) электронного письма вам urlencode
токен, но в ConfirmEmail вы не decoding
знак
Кодирование просто гарантирует, что его можно использовать в URL-адресе, и в нем нет разрывных символов. Однако токен, который вы должны проверить, не является закодированным, он по-прежнему является токеном, который вы получили до кодирования. Другими словами; вам нужно снова декодировать токен, чтобы он вернулся к тому, что было, когда он был сгенерирован.