Изменить рабочий процесс электронной почты в ASP.NET Core - PullRequest
0 голосов
/ 14 мая 2019

Если пользователь хочет перейти на новый адрес электронной почты, я использую:

var token = await _userManager.GenerateChangeEmailTokenAsync(user, newEmail);

... и отправьте письмо с подтверждением, содержащее этот токен изменения. Пользователь нажимает на ссылку в письме, возвращается на сайт, и теперь мне нужно изменить адрес электронной почты.

НО, я не знаю новый адрес электронной почты.

Я прошел через цикл подтверждения почты, поэтому хочу его использовать. Повторный запрос электронной почты может привести к ошибкам, которые могут заблокировать пользователя из его учетной записи, а также является еще одним препятствием для пользователя и большим количеством кода для меня.

Очевидные решения:

  • попросите его еще раз (и рискуете ошибиться, и сделает почтовый цикл бессмысленным)
  • сохранить новый адрес электронной почты в User.NewEmailTemp (чёрт, вы хотите сохранить это без сохранения состояния)
  • включить его в ссылку в письме (плохая защита!)

Там может быть лучший способ. Маркер изменения включает в себя набор данных, включая «цель» , которая содержит новый адрес электронной почты. Могу ли я каким-то образом извлечь / расшифровать цель, или она искажена как часть процесса хеширования?

1 Ответ

1 голос
/ 14 мая 2019

Ответ - просто сохранить его. Без гражданства на самом деле не вариант. Однако это не означает, что вам нужно обязательно загрязнять его субдоменом. Например, вы можете создать отдельную сущность, такую ​​как EmailChangeRequest, с реквизитами для новой электронной почты, токена и, возможно, отметки времени (в основном для сокращения / истечения срока действия). Маркер здесь не для проверки, а для поиска, поэтому его можно считать ключом на столе.

Если коротко, пользователь нажимает на ссылку, вы просматриваете запрос с помощью токена, получаете новое электронное письмо от него и затем набираете ChangeEmailAsync с этим новым письмом и токеном.

Если вы действительно против какой-либо настойчивости, я лично играл с подходом JWT-esque. Я говорю «-esque», потому что передача полностью зашифрованного и подписанного JWT в качестве параметра запроса или маршрута приведет к созданию для чрезвычайно длинных URL-адресов для ваших ссылок подтверждения, возможно, даже приблизится к пределам запросов. Вместо этого я отрубил заголовок JWT, поскольку заголовок в основном предназначен для межклиентского взаимодействия. В этом сценарии я могу смело предположить метод и эмитента шифрования, и в этом нет необходимости.

Еще одно изменение, которое я сделал, - использование токенов в стиле TOTP вместо зашифрованных хешей, используемых по умолчанию. Это служит для дальнейшего уменьшения размера токена JWT, и, поскольку я шифрую сам JWT, не так важно, если токен внутри зашифрован сам. Поставщик токенов для таких вещей, как подтверждение по электронной почте, может быть легко настроен в ConfigureServices, и есть встроенных поставщиков токенов TOTP , которые можно использовать, так что это также относительно низкое трение .

Я до сих пор не думаю, что сохранять это обязательно плохо, особенно если вы используете отдельную сущность за пределами своего пользовательского поддоменов. Тем не менее, псевдо-JWT-подход может лучше соответствовать вашим потребностям, если вы не хотите идти по этому пути.

...