Подтвердить что ты не робот

Создайте временный URL для пароля reset

Я хочу реализовать функцию "Забыли пароль" на своем веб-сайте. Мне нравится вариант, когда электронное письмо, содержащее временный одноразовый URL-адрес, который истекает через некоторое время, отправляется пользователю.

Я просмотрел следующие страницы, чтобы получить эти идеи, но я не уверен, как реализовать это с помощью ASP.NET и С#. Как указал один из пользователей, если я смогу реализовать это без сохранения этой информации в базе данных, это будет идеально. Просьба сообщить.

Пароль reset путем отправки временных паролей по электронной почте

Спасибо.

4b9b3361

Ответ 1

В зависимости от ваших потребностей вы можете зашифровать информацию в формате, подобном следующему формату

(UserId)-(ExpireDate)

Зашифруйте данные, сделайте ссылку, затем расшифруйте данные и примите меры оттуда...

Грубый, но наиболее вероятно используемый и не требующий использования БД

Ответ 2

Вероятно, самым простым способом будет изменение таблицы пользователей, чтобы добавить 2 дополнительных столбца, или если вы не хотите изменять существующую таблицу, вы можете добавить новую зависимую таблицу под названием "UserPasswordReset" или что-то в этом роде. Столбцы выглядят следующим образом:

PasswordResetToken UNIQUEIDENTIFIER,
PasswordResetExpiration DATETIME

Если вы перейдете с дополнительным маршрутом таблицы, вы также можете добавить столбец UserID, сделать его первичным ключом и ссылкой на ключ foriegn обратно в таблицу ваших пользователей. Также будет рекомендовано УНИКАЛЬНОЕ ограничение. Затем вы просто используете Guid в своем приложении asp.net в качестве токена.

Поток может быть примерно таким:

  • Пользователь запрашивает пароль reset для своей учетной записи
  • Вставить новую запись в таблицу (или обновить их запись пользователя), установив PasswordResetExpiration на дату в будущем (DateTime.Now.AddDays(1)) и установить токен в Guid.NewGuid()
  • Отправьте ссылку пользователю на страницу ResetPassword.aspx с помощью guid в строке запроса (http://www.yoursite.com/ResetPassword.aspx?token=Guid-here)
  • Используйте страницу ResetPassword.aspx для проверки полей токена и срока действия. (I.E. Убедитесь, что DateTime.Now < PasswordResetExpiration)
  • Предоставьте простую форму, которая позволяет пользователю reset использовать этот пароль.

Я знаю, что вы хотели избежать изменения базы данных, но это, пожалуй, самый простой способ.

Ответ 3

Я использовал Hashing Class для создания уникальных автоматических логинов, состоящих из текущей даты/времени и адреса электронной почты пользователей:

string strNow = DateTime.Now.ToString();
string strHash = strNow + strEmail;
strHash = Hash.GetHash(strHash, Hash.HashType.SHA1);

получить класс Hash от: http://www.developerfusion.com/code/4601/create-hashes-md5-sha1-sha256-sha384-sha512/

Затем просто возьмите его из URL, используя:

if (Request.QueryString["hash"] != null)
{
                //extract Hash from the URL
                string strHash = Request.QueryString["hash"];
}

Ответ 4

@Alex

Вы также можете использовать классы System.Security.Cryptography в .NET для хэш-алгоритмов. Например:

using System.Security.Cryptography;
...
var hash = SHA256CryptoServiceProvider.Create().ComputeHash(myTokenToHash);
...

Ответ 5

Здесь класс System.Guid у вашего друга, так как он будет генерировать уникальное (ну, достаточно уникальное) 128-битное число:

  • Создайте новый Guid (System.Guid.NewGuid())
  • Сохраните, что Guid где-нибудь (объект приложения может быть?)
  • Отправить собственный URL-адрес в электронном письме с инструкцией
  • Когда пользователь нажимает на сайт, введите им пароль, который вы отправили по электронной почте.
  • Если пароли совпадают, перейдите и заставьте их ввести новый пароль

Ответ 6

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

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

Кроме того, включение "реальной" информации в токен reset может быть расшифровано, если кто-то действительно хочет его и имеет мощность. Было бы безопаснее генерировать случайную строку, сохранить ее в db в строке для этого пользователя и затем вернуться к ней при нажатии ссылки.

Это дает вам две вещи:

1) Там нечего расшифровывать, и поэтому от него не может быть ничего полезного. 2) Наличие токена в записи пользователя указывает, что выполняется reset, и учетная запись должна рассматриваться как заблокированная.

Ответ 7

Цель отправки некоторых данных | строка в адрес электронной почты пользователя - это проверка владельца учетной записи. Пожалуйста, обратите внимание на некоторые моменты:

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

Результат: Я думаю, это лучше, если вы

  • объединить электронную почту пользователя со строкой, затем зашифровать их (не хеш, потому что хешированное значение не может быть обратным) и отправить пользователю электронная почта.
  • Пользователь кликнет и ваша страница получит зашифрованное значение.
  • расшифровать значение.
  • извлечение электронной почты пользователя.
  • найти электронную почту в базе данных.
  • сравнить строку с полученной ссылкой с другой, прикрепленной к пользователю электронной почты в базе данных.

Удачи.

Ответ 8

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

Кратко объяснить обычную соль и хеширование паролей; скажем, что соль 1111, а pasword password, вы разделите две строки и хеш строку 1111password, скажем, это даст вам хэш 9999, тогда вы сохраните оригинальную соль 1111 и хеш 9999 в вашей записи пользователя.

Когда вы проверяете пароль, вы используете сохраненную соль, объединяете попытку пароля, хеш и сравниваете с сохраненным хешем. Например asecret становится 1111asecret, но хешируется до 8888. Это не соответствует исходному хешу, поэтому совпадение пароля не выполняется.

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

Для пароля reset я бы поместил уникальный идентификатор для пользователя, то есть адрес электронной почты, дату запроса и новый хеш. Этот хэш будет генерироваться из тех деталей, которые объединены вместе, плюс соль и хэш, уже сохраненные для пользователя.

Например:

Email: [email protected]
Request Date: 2014-07-17
Salt: 1111
Hash: 9999

Создайте новый хэш из этих конкатенированных, т.е. '[email protected]', скажем, это дает хэш 7777.

Затем URL-адрес, который я создаю, будет содержать адрес электронной почты, дату запроса и новый хэш:

https:\\www.example.com\[email protected]&requestdate=2014-07-17&hash=7777

Сервер объединит адрес электронной почты и дату поставки с солью и хэшем и подтвердит, что хэш, который он сгенерировал, является таким же, как и поставляемый. Если это ОК, то он отобразит форму reset с теми же тремя параметрами, скрытыми за ней, иначе будет ошибка. Они будут повторно отправлены и перепроверены при вводе нового пароля для предотвращения подмены этой формы.

Адрес электронной почты должен быть отправлен для запроса, и он отправляется только по электронной почте по тому же адресу. дата вряд ли является дополнительной информацией, и хеш не обратим, поэтому ничего не дает. Ничто не было записано в базу данных, и любое вмешательство в параметры приводит к сбою хеша, а URL-адрес сообщает об ошибке.