zoukankan      html  css  js  c++  java
  • 自己关于注册,邮箱激活的思路

    个人觉得,邮箱激活这种做法,最重要功能,是为了验证邮箱的邮箱的有效性,其次防止机器人机械注册无良账号。
    点击“下一步”,发送邮件。把用户提交的表单信息放到XML,等他激活了之后再添加到数据库,然后把XML的相关信息删掉。当然,最好的做法是在直接在数据库里面设置一个状态字段,我们只需要修改一下这两个值就可以了。个人觉得,两个的存储量是一样的,但是操作的话,XML还是麻烦一点,所以推荐使用数据设计状态这种做法。

    在发送的邮件里,有激活的链接,比如:http://localhost:2556/WebSite/Register.aspx?Re=YeXJAEYeOXJiJOYeeUQinYeAEJAEHjJHjEs*wenjunli2
    这个地址是经过加密的。“*”之前的时间(精确到毫秒),为什么要做这个时间呢,是为了设定在多少时间后失效,失效后把存储的数据删掉(激活失效这个功能)。“*”之后是用户名,其实也应该经过加密,上面没有加密。真正实现激活的是靠这个用户名,如果数据库中存在这个用户名,并且时间没有过期,则激活成功,把数据库用户状态修改。

    public class MyService
    {
    // 对称加密算法提供器
    private ICryptoTransform encryptor; // 加密器对象
    private ICryptoTransform decryptor; // 解密器对象
    private const int BufferSize = 1024;
    
    
    public MyService(string algorithmName, string key)
    {
    SymmetricAlgorithm provider = SymmetricAlgorithm.Create(algorithmName);
    provider.Key = Encoding.UTF8.GetBytes(key);
    provider.IV = new byte[] { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
    
    
    encryptor = provider.CreateEncryptor();
    decryptor = provider.CreateDecryptor();
    }
    
    
    public MyService(string key) : this("TripleDES", key) { }
    
    
    // 加密算法
    private string Encrypt(string clearText)
    {
    // 创建明文流
    byte[] clearBuffer = Encoding.UTF8.GetBytes(clearText);
    MemoryStream clearStream = new MemoryStream(clearBuffer);
    
    
    // 创建空的密文流
    MemoryStream encryptedStream = new MemoryStream();
    
    
    CryptoStream cryptoStream =
    new CryptoStream(encryptedStream, encryptor, CryptoStreamMode.Write);
    
    
    // 将明文流写入到buffer中
    // 将buffer中的数据写入到cryptoStream中
    int bytesRead = 0;
    byte[] buffer = new byte[BufferSize];
    do
    {
    bytesRead = clearStream.Read(buffer, 0, BufferSize);
    cryptoStream.Write(buffer, 0, bytesRead);
    } while (bytesRead > 0);
    
    
    cryptoStream.FlushFinalBlock();
    
    
    // 获取加密后的文本
    buffer = encryptedStream.ToArray();
    string encryptedText = Convert.ToBase64String(buffer);
    return encryptedText;
    }
    
    
    // 解密算法
    private string Decrypt(string encryptedText)
    {
    byte[] encryptedBuffer = Convert.FromBase64String(encryptedText);
    Stream encryptedStream = new MemoryStream(encryptedBuffer);
    
    
    MemoryStream clearStream = new MemoryStream();
    CryptoStream cryptoStream =
    new CryptoStream(encryptedStream, decryptor, CryptoStreamMode.Read);
    
    
    int bytesRead = 0;
    byte[] buffer = new byte[BufferSize];
    
    
    do
    {
    bytesRead = cryptoStream.Read(buffer, 0, BufferSize);
    clearStream.Write(buffer, 0, bytesRead);
    } while (bytesRead > 0);
    
    
    buffer = clearStream.GetBuffer();
    string clearText =
    Encoding.UTF8.GetString(buffer, 0, (int)clearStream.Length);
    
    
    return clearText;
    }
    
    
    /// <summary>
    ///加密
    /// </summary>
    /// <param name="clearText"></param>
    /// <param name="key"></param>
    /// <returns></returns>
    public static string Encrypt(string clearText, string key)
    {
    MyService helper = new MyService(key);
    return helper.Encrypt(clearText);
    }
    
    
    /// <summary>
    /// 解密
    /// </summary>
    /// <param name="encryptedText"></param>
    /// <param name="key"></param>
    /// <returns></returns>
    public static string Decrypt(string encryptedText, string key)
    {
    MyService helper = new MyService(key);
    return helper.Decrypt(encryptedText);
    }
    }
    上面第一个是自己写的一个时间加密规则,第二个是.net的加密规则,其实也可以用MD5,不过我不懂用,也没用过。
    
    /// <summary>
    /// 发送邮件(注册)
    /// </summary>
    /// <param name="name">用户姓名</param>
    /// <param name="userName">用户名</param>
    /// <param name="userPass">密码</param>
    /// <param name="EmailAdd">邮箱地址</param>
    /// <returns></returns>
    public static bool sendEmail(string name, string userName, string userPass, string EmailAdd)
    {
    try
    {
    SmtpClient smtp = new SmtpClient(); //实例化一个SmtpClient
    smtp.DeliveryMethod = SmtpDeliveryMethod.Network; //将smtp的出站方式设为 Network
    smtp.EnableSsl = false;//smtp服务器是否启用SSL加密
    smtp.Host = "smtp.sina.com.cn"; //指定 smtp 服务器地址
    smtp.Port = 25; //指定 smtp 服务器的端口,默认是25,如果采用默认端口,可省去
    //如果你的SMTP服务器不需要身份认证,则使用下面的方式,不过,目前基本没有不需要认证的了
    smtp.UseDefaultCredentials = true; //如果需要认证,则用下面的方式
    smtp.Credentials = new NetworkCredential("qinlin1991@sina.com", "3155446");
    MailMessage mm = new MailMessage(); //实例化一个邮件类
    mm.Priority = MailPriority.High; //邮件的优先级,分为 Low, Normal, High,通常用 Normal即可
    mm.From = new MailAddress("shirilimu@sina.com", "求知科技", Encoding.GetEncoding(936));
    //收件方看到的邮件来源;
    //第一个参数是发信人邮件地址
    //第二参数是发信人显示的名称
    //第三个参数是 第二个参数所使用的编码,如果指定不正确,则对方收到后显示乱码 
    //936是简体中文的codepage值
    //注:上面的邮件来源,一定要和你登录邮箱的帐号一致,否则会认证失败
    mm.ReplyTo = new MailAddress("shirilimu@sina.com", "求知科技", Encoding.GetEncoding(936));
    //ReplyTo 表示对方回复邮件时默认的接收地址,即:你用一个邮箱发信,但却用另一个来收信
    //上面后两个参数的意义, 同 From 的意义
    //mm.CC.Add("a@163.com,b@163.com,c@163.com");
    //邮件的抄送者,支持群发,多个邮件地址之间用 半角逗号分开
    //当然也可以用全地址,如下:
    //mm.CC.Add(new MailAddress(EmailAdd, "覃林", Encoding.GetEncoding(936)));
    //mm.CC.Add(new MailAddress("b@163.com", "抄送者B", Encoding.GetEncoding(936)));
    //mm.CC.Add(new MailAddress("c@163.com", "抄送者C", Encoding.GetEncoding(936)));
    //mm.Bcc.Add("d@163.com,e@163.com");
    //邮件的密送者,支持群发,多个邮件地址之间用半角逗号 分开
    //当然也可以用全地址,如下:
    //mm.CC.Add(new MailAddress("d@163.com", "密送者D", Encoding.GetEncoding(936)));
    //mm.CC.Add(new MailAddress("e@163.com", "密送者E", Encoding.GetEncoding(936)));
    //mm.Sender = new MailAddress("xxx@xxx.com", "邮件发送者", Encoding.GetEncoding(936));
    //可以任意设置,此信息包含在邮件头中,但并不会验证有效性,也不会显示给收件人
    //说实话,我不知道有啥实际作用,大家可不理会,也可不写此项
    //mm.To.Add("g@163.com,h@163.com");
    //邮件的接收者,支持群发,多个地址之间用半角逗号 分开
    //当然也可以用全地址添加
    mm.To.Add(new MailAddress(EmailAdd, name, Encoding.GetEncoding(936)));
    //mm.To.Add(new MailAddress("h@163.com", "接收者h", Encoding.GetEncoding(936)));
    mm.Subject = "考无忧-个人账号信息"; //邮件标题
    mm.SubjectEncoding = Encoding.GetEncoding(936); // 这里非常重要,如果你的邮件标题包含中文,这里一定要指定,否则对方收到的极有可能是乱码。
    // 936是简体中文的pagecode,如果是英文标题,这句可以忽略不用
    mm.IsBodyHtml = true; //邮件正文是否是HTML格式
    mm.BodyEncoding = Encoding.GetEncoding(936); //邮件正文的编码, 设置不正确, 接收者会收到乱码
    mm.Body = "<table style='border:3px solid #D9F4FF;658px;' cellspacing='0' cellpadding='0'><tr><td class='style1'><table style='border:1px solid #65C3D6;font-size:12px;' cellspacing='0' cellpadding='0'><tr><td style='657px;'><img src='http://www.k51.com.cn/images/logo.jpg' /><br/><b style=' color:#F3750F'>" + name + "</b>:" + "<table cellspacing='0' cellpadding='5' border='0' style=' 653px; margin-bottom: 0px; margin-top:-10px'><tr><td style='padding:20px 16px;color:#333;'><table cellspacing='0' cellpadding='0' border='0'><tr><td style='padding-left:14px;' class='style3'>您好,感谢您注册考无忧!祝你使用愉快,才识倍增!</td></tr><tr><td style='padding-left:14px;' class='style3'>你的登录名为:<b style='color:#F3750F;'>" + userName + "</b></td></tr> <tr><td style='padding-left:14px;' class='style1'>&nbsp;&nbsp;&nbsp;你的密码为:<b style='color:#F3750F;'>" + userPass + "</b></td></tr> <tr style=' font-size:15px; font-weight:bold;'><td><a href='"+"http://localhost:2556/WebSite/Register.aspx?Re="+ LoginService.GetStrUserRegist() + " * " + userName +"'>点此链接激活您都账号=></a></td></tr><tr><td>请在40分钟之内激活,逾期无效,抓紧时间哦~</td></tr><tr><td>点击进入考无忧官方网站:<a href='http://www.k51.com.cn'>http://www.k51.com.cn</a></td></tr><tr><td style='color:#999;font-size:12px;display:block;border-top:1px dotted #9F9F9F;padding-top:18px;padding-left:14px;' class='style4'>这只是一封系统自动发出的邮件,请不要直接回复。</td></tr></table></td></tr></table></td></tr></table></td></tr></table>"; //邮件正文
    //mm.Attachments.Add(new Attachment(@"c:\d\1.doc", System.Net.Mime.MediaTypeNames.Application.Rtf)); //添加附件,第二个参数,表示附件的文件类型,可以不用指定
    //可以添加多个附件
    //mm.Attachments.Add(new Attachment(@"d:b.doc"));
    smtp.Send(mm); //发送邮件,如果不返回异常,则大功告成了。
    }
    catch (Exception)
    {
    return false;
    }
    return true;
    }

    发送激活邮件后,有一个页面,点击“跳转到邮箱”跳转用户注册邮箱首页。这个我觉得应该是在本地存了一个邮箱首页的库,根据用户的选择,判断对应邮箱提供方。

    另外,把用户信息加密后Cookie存放在本地,可以实现“一周内保存”的功能。

  • 相关阅读:
    centos 启动报错 “error:failure reading sector 0x9b268 from 'hd0'”
    Jenkins安装及插件管理
    svn关联Jenkins自动发布代码
    LVS逻辑卷的创建、扩展、销毁
    Linux上安装SVN服务端及SVN的可视化工具
    CentOS7下配置防火墙放过Keepalived
    Prometheus apache_exporter 监控配置
    CentOS启动报错:Error at boot time: "[Firmware Bug]: TSC_DEADLINE disabled due to Errata
    linux上安装open***
    python学习day15 Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
  • 原文地址:https://www.cnblogs.com/hougelou/p/2854382.html
Copyright © 2011-2022 走看看