源栈培训:ASP.NET MVC:找回密码:Email

更多
2020年02月02日 22点03分 作者:叶飞 修改
激活Email

前提:相信Email是安全的。

策略:

  1. 为该Email生成一个验证码(还可以有一个有限截止时间)
  2. 将Email的Id和该验证码包含在一个链接中,发送到该Email
  3. 在链接指向的页面后台,用链接中的id和验证码和数据库中的值进行比对

实现中的难点:

  1. 按职责:
    • url格式(使用的http协议、域名、路径、url参数名等)均在UI层生成
                  string validationUrlFormat = 
                      $"{Request.Scheme}://{Request.Host}/Email/Validate?{_code}={{0}}&{_id}={{1}}";
      
    • Email验证码应在BLL层生成
              public void MakeValidationCode()
              {
                  ValidationCode = new Random().Next().ToString();
              }
    • Email的Id需要在Email被Repository存储之后才能生成
              public void Save(Email email)
              {
                  Emails.Add(email);
                  SaveChanges();
              }
    • 那么,Email的发送应该是哪一个层的职责?
  2. 如何保证验证码只生成一次?
    • 构造函数和属性都会被EF反复调用,不宜使用(演示:略)
      注意:不建议在Entity(需要映射到数据库的实体类)的构造函数和属性中加入业务逻辑
    • 方法如何防止被多次调用?
                  //体会:异常使用的场景
                  if (!string.IsNullOrEmpty(ValidationCode))
                  {
                      throw new InvalidOperationException(
                          $"在ValidationCode已有值的情况下(当前值为:{ValidationCode}),试图再次生成");
                  }
  3. 如何发送Email?()
    理解SMTP(Simple Mail Transfer Protocol)
                MailMessage mail = new MailMessage();
                mail.From = new MailAddress("your_email_address@gmail.com");
                mail.To.Add("to_address");
                mail.Subject = "Test Mail";
                mail.Body = "This is for testing SMTP mail from GMAIL";
    
                SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");
                SmtpServer.Port = 587;
                SmtpServer.Credentials = new System.Net.NetworkCredential("username", "password");
                SmtpServer.EnableSsl = true;
    
                SmtpServer.Send(mail);


邮箱地址:feige_20200214@163.com

密码:yuanzhan17bang

(演示:略)


课间作业:

  1. 事实上有没有激活?
  2. 为什么需要:if (!string.IsNullOrEmpty(id) && !string.IsNullOrEmpty(code))
补充:exception



作业

  1. 实现用户登录全部功能,包括:导航栏变更(登录/退出登录)、新手任务等

此后所有作业都需要按项目流程:发布需求 - 承接 - 验收,团队实现,此后不再重复说明。



作业点评


  • 注意entity的可访问性 (只读)
  • 需求文档:一体两用(开发/测试)
  • 开发设计文档 vs 需求文档
  • 一定要指定完成时间,未及时完成项目经理要催


示例:

原需求:可以使用邮箱找回密码,点击发送邮件获取验证码,用验证码重置密码,重置密码的邮件会发送到你填写的Email中。
问题:

  1. 找回密码的入口(页面)在哪里?页面内容如何?
  2. 发送邮件如何获取验证码?弹出提示吗?
  3. 如何用验证码重置密码?需要自己填写吗?
  4. 邮箱是找回密码时填写,还是注册时填写
源栈培训 Email 找回密码
赞: 6 踩: 0

打赏
已收到打赏的 帮帮币

你的 打赏 非常重要!
为了保证文章的质量,每一篇文章的发布,都已经消耗了作者 1 枚 帮帮币
没有“帮帮币”,作者无法发布新的文章。

全系列阅读
评论 / 0

ASP.NET


RazorPage

微软推荐的、最新的、基于Razor页面和.NET core的新一代Web项目开发技术,包括Razor Tag Helper、Model绑定和Validation、Session/Cookie、内置依赖注入等……

MVC

过去两年间最流行的、基于.NET Framework和MVC模式的ASP.NET MVC框架,主要用于讲解安全、性能、架构和各种实战功能演示……

其他Web项目

包括WebForm和WebApi

全部
关键字



帮助

反馈