Ваша проблема использует SetEmailAsync
для этой цели. Этот метод предназначен для установки электронной почты для пользователя , если в настоящее время его нет . В таком случае настройка, подтвержденная как ложная, имеет смысл и не вызовет никаких проблем.
Есть еще один метод, ChangeEmailAsync
, который вы должны использовать. Этот метод требует токен, который будет получен из потока подтверждения электронной почты. Другими словами, шаги, которые вы должны сделать:
- Пользователь отправляет форму с новым адресом электронной почты для изменения на
- Вы отправляете электронное письмо с подтверждением пользователю. Адрес электронной почты, на который изменяется пользователь, необходимо сохранить либо в ссылке для подтверждения, либо в отдельном месте в вашей базе данных. Другими словами, фактическая электронная почта пользователя в его записи не изменилась .
- Пользователь нажимает ссылку для подтверждения по электронной почте. Вы получаете новый адрес электронной почты, который они хотят изменить, либо по ссылке, либо там, где вы сохранили ее ранее
- Вы звоните
ChangeEmailAsync
с этим электронным письмом и токеном из ссылки для подтверждения.
- Электронная почта пользователя теперь изменена и подтверждена.
EDIT
FWIW, да, похоже, это проблема с шаблоном по умолчанию. Не уверен, почему они сделали это так, потому что да, это сильно ломает вещи, и, как я сказал в своем ответе, ChangeEmailAsync
существует именно для этой цели. Просто следуйте шагам, которые я описал выше, и измените логику здесь, что происходит, когда пользователь отправляет новый адрес электронной почты через страницу управления.
РЕДАКТИРОВАТЬ # 2
Я подал проблему на Github для этого. Сейчас я не могу больше уделять этому времени, но я попытаюсь отправить запрос на исправление, если у меня есть время, и никто больше меня не побеждает. Исправление относительно простое.
РЕДАКТИРОВАТЬ # 3
Мне удалось заставить основной поток изменений электронной почты работать в форке. Тем не менее, команда уже определила проблему и, кажется, включает ее как часть более серьезного пересмотра интерфейса Identity. Я, скорее всего, не буду больше уделять этому времени сейчас, но призываю вас следить за обновлениями от команды. Если вам случится позаимствовать из моего кода для реализации исправления сейчас, имейте в виду, что я пытался создать решение с минимальной энтропией к другому коду. В реальном производственном приложении вы должны сохранить новое электронное письмо где-нибудь, например, в базе данных, а не передавать его, например, в URL.