ASP MVC: подтверждение адреса электронной почты (Шифрующий ссылку активации)

Хорошо я немного застреваю о том, как решить эту проблему.

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

Но я испытываю затруднения при генерации ссылки.

Я уже записал контроллер для принятия ссылок с корректными ключами. я только понятия не имею о том, как генерировать ключи активации.

Таким образом, когда пользователь регистрируется, я отправлю ему ссылку почтой как это:

Your activation link is : http://site.com/user/verify?key=keyhere

Теперь я создал этот метод (названный контроллером/действием) для обработки ключа в ссылке:

 public string Verify(string value)
    {
        String email = Decrypt(value);

        user u = gebRep.GetUsers().WithEmail(email).SingleOrDefault();
        if (u != null)
        {
            u.emailValid = true;
            userReppository.Save();
        }

        return "Invallid validation value!";
    }

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

Мне нужен некоторый (не к сложному, но безопасному) способ зашифровать электронную почту в urlfriendly ключ.

Tyvm

5
задан 1 May 2010 в 11:43
поделиться

3 ответа

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

3
ответ дан 18 December 2019 в 06:34
поделиться

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

Вот пример шифрования Rijndael с помощью C # .

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

Дополнительное преимущество этого метода в том, что он также упрощает получение ссылки с истекающим сроком действия.Скажем, например, вам нужна ссылка для 24-часового сброса пароля, поэтому вы отправляете пользователю ссылку с кодом проверки в ней, но вместо того, чтобы хранить данные о коде проверки и дате истечения срока его действия в вашей системе, шифруете электронную почту пользователя и срок годности и отправьте его как проверочный код. По сути, вы можете зашифровать значение вроде 1272746267 | 14 , где первая часть - это метка времени истечения срока действия ссылки, а второе значение - это идентификатор пользователя в системе. Расшифровав и проанализировав временную метку, вы можете сразу принять решение, действительна ли ссылка. Единственный недостаток, который я вижу в этом подходе, - это, возможно, длина зашифрованной строки, но, поскольку вы отправляете ее по электронной почте, это не имеет большого значения.

Вот быстрый пример:

Key: a1b2c3d4e5f6h7i8
Value: 1272746267|14

Encrypted: wxtVC1u5Q7N9+FymCln3qA==
Decrypted: 1272746267|14

Не забудьте добавить Url.Encode () к зашифрованному значению перед его связыванием, так как оно может содержать некоторые недружелюбные символы, такие как косая черта.

16
ответ дан 18 December 2019 в 06:34
поделиться

Возможно, проще не использовать никакого шифрования и сделать все немного проще.

Создайте новый Guid для ссылки (и сохраните его вместе с пользователем), затем просто проверяйте пользователя при вызове ссылки

5
ответ дан 18 December 2019 в 06:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: