Ответ - просто сохранить его. Без гражданства на самом деле не вариант. Однако это не означает, что вам нужно обязательно загрязнять его субдоменом. Например, вы можете создать отдельную сущность, такую как EmailChangeRequest
, с реквизитами для новой электронной почты, токена и, возможно, отметки времени (в основном для сокращения / истечения срока действия). Маркер здесь не для проверки, а для поиска, поэтому его можно считать ключом на столе.
Если коротко, пользователь нажимает на ссылку, вы просматриваете запрос с помощью токена, получаете новое электронное письмо от него и затем набираете ChangeEmailAsync
с этим новым письмом и токеном.
Если вы действительно против какой-либо настойчивости, я лично играл с подходом JWT-esque. Я говорю «-esque», потому что передача полностью зашифрованного и подписанного JWT в качестве параметра запроса или маршрута приведет к созданию для чрезвычайно длинных URL-адресов для ваших ссылок подтверждения, возможно, даже приблизится к пределам запросов. Вместо этого я отрубил заголовок JWT, поскольку заголовок в основном предназначен для межклиентского взаимодействия. В этом сценарии я могу смело предположить метод и эмитента шифрования, и в этом нет необходимости.
Еще одно изменение, которое я сделал, - использование токенов в стиле TOTP вместо зашифрованных хешей, используемых по умолчанию. Это служит для дальнейшего уменьшения размера токена JWT, и, поскольку я шифрую сам JWT, не так важно, если токен внутри зашифрован сам. Поставщик токенов для таких вещей, как подтверждение по электронной почте, может быть легко настроен в ConfigureServices
, и есть встроенных поставщиков токенов TOTP , которые можно использовать, так что это также относительно низкое трение .
Я до сих пор не думаю, что сохранять это обязательно плохо, особенно если вы используете отдельную сущность за пределами своего пользовательского поддоменов. Тем не менее, псевдо-JWT-подход может лучше соответствовать вашим потребностям, если вы не хотите идти по этому пути.