ASP MVC:电子邮件验证(加密激活链接)

5 c# asp.net email encryption asp.net-mvc

好吧,我有点坚持如何解决这个问题.

当用户注册时.我想给他发一个链接,以便他可以验证他的电子邮件地址.

但我有麻烦产生链接.

我已经编写了控制器来接受带有正确密钥的链接.我根本不知道如何生成激活密钥.

因此,当用户注册时,我将通过邮件向他发送链接,如下所示:

Your activation link is : http://site.com/user/verify?key=keyhere
Run Code Online (Sandbox Code Playgroud)

现在我创建了这个方法(由控制器/动作调用)来处理链接中的键:

 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!";
    }
Run Code Online (Sandbox Code Playgroud)

现在我的问题是我不知道如何加密和解密电子邮件到某种键(网址友好)所以我可以用链接邮寄它,并可以用它来验证电子邮件.

我需要某种(不是复杂但安全)的方式将电子邮件加密到urlfriendly键.

Tyvm

Nat*_*lor 16

您可以使用Rijndael加密之类的东西来加密用户的电子邮件地址作为验证密钥,然后当他们单击链接时,您只需使用私有加密密钥解密验证代码以检索电子邮件地址并激活相应的用户.使用此技术,您无需存储有关用户的任何额外数据以进行帐户激活,并且您仍然需要加密,非常难以猜测的值作为验证码.

以下是使用C#进行Rijndael加密的示例.

如果您不熟悉它,使用Rijndael加密,您将拥有一个只有您知道的私钥,该私钥用作数据的加密密钥.只要您知道加密密钥,您就可以随时解密所有加密密钥.

这种技术的另外一点就是它可以很容易地建立一个过期的链接.比如说你想要一个24小时密码重置链接,所以你向用户发送一个包含验证码的链接,而不是在你的系统中存储有关验证码及其截止日期的数据,加密用户的电子邮件和到期日期并将其作为验证码发送.所以基本上,您可以加密一个值,例如,1272746267|14第一部分是链接到期时间戳,第二个值是系统中用户的ID.在解密并解析出时间戳后,您可以在那里做出决定,无论链接是否仍然有效.我看到这种方法的唯一缺点可能是加密字符串的长度,但看到你在电子邮件中发送它并不重要.

这是一个简单的例子:

Key: a1b2c3d4e5f6h7i8
Value: 1272746267|14

Encrypted: wxtVC1u5Q7N9+FymCln3qA==
Decrypted: 1272746267|14
Run Code Online (Sandbox Code Playgroud)

确保在链接之前在加密值上抛出Url.Encode(),因为它可能包含一些不友好的字符,如斜杠.


Mar*_*man 5

可以更容易地不使用任何加密并使事情变得更简单.

为链接创建一个新的Guid(并与用户保存),然后在调用链接时验证用户


Dea*_*ing 3

我执行此操作的方法是简单地为“密钥”生成一个较大的随机数,然后将激活密钥和电子邮件之间的映射存储在数据库中。