这是您可以用来加密和解密您的网址的库
http://jbtule.github.io/keyczar-dotnet/
给定您的用例,您将创建加密的 url 并将其发送到电子邮件中
为了这个答案,让我们假装加密的网址是
“你的域名/加密/kladsfiopfvnjladsiopdfsipejkadsjsadipodafskl”
假设加密后的字符串表示一个字符串,可以解密为字段 username、dateValidThrough 和 emailaddress,用“|”分隔 字符。IE
用户名+“|” + datevalidthough + "|" 电子邮件地址
好的,所以要接收加密的 url,你的 RouteConfig.cs 路由中有一个路由
routes.MapRoute(
name: "PaswordReset",
url: "Encrypted/{id}",
defaults: new {controller = "Password", action = "Reset", id = UrlParameter.Optional});
这会将他们带到这个有两种方法的控制器
public class PasswordController{
public ActionResult Reset(string id){}
//returns a view that has a form for them to enter their username and email
[HttpPost]
public ActionResult Reset(string id, string username, string email){}
//derypt here and verify etc.
}
首先,他们会看到一个表格,他们可以在其中输入他们的电子邮件地址和用户名。它应该有一个用于加密 url 部分的隐藏字段
当他们提交表单时,使用您加密它的密码来解密 id。
验证他们的用户名和电子邮件地址是否匹配。确保 datevalidthrough 为 < 今天,然后允许他们更改密码。
要制作加密字符串,您将使用上面的库,就像
string plaintext = userName + "|" + DateTime.Today.AddDays(2).ToString() + "|" + userEmailAddress;
WebBase64 ciphertext;
string key = (new Random().Random(10000000) + 1000).ToString();
//pretend this dictionary represents a database storage medium
public static Dictionary<string,string> CypherTextToKey= new Dictionary<string,string>();
//encrypting
using (var encrypter = new Encrypter(key))
{
ciphertext = encrypter.Encrypt(plaintext);
}
CypherTextToKey.Add(cyphertext, key);
SendEmail(user, "Encrypted/"+cyphertext");
要解密它,你会做类似的事情
var key = CypherTextToKey[cyphertext]; //get the key from your database
using (var crypter = new Crypter(key)){
var plaintext2 = crypter.Decrypt(ciphertext)
}
如果全部匹配,请给他们一个新密码等。
有一种方法可以使用加密的 url 来操作整个站点,但那是另一回事,我不确定这是否是您需要的(它有点复杂)。如果您想加密每个网址,请发表评论,我会用另一个答案回复您。