文档章节

【MVC】会员注册/登录,普通验证,会员名是否注册Ajax验证以及会员邮件验证实现原理

深圳大道
 深圳大道
发布于 2016/12/29 15:37
字数 1192
阅读 3
收藏 0
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

namespace MvcTest.Models
{
    public partial class Member
    {
        public int Id { get; set; }

        [DisplayName("会员账号")]
        [Required(ErrorMessage = "请输入 Email 地址")]
        [Description("我们直接以 Email 当成会员的登录账号")]
        [MaxLength(250, ErrorMessage = "Email地址长度无法超过250个字符")]
        [DataType(DataType.EmailAddress)]
        [Remote("CheckDup", "Member", HttpMethod = "POST", ErrorMessage = "您输入的 Email 已经有人注册过了!")]
        public string Email { get; set; }

        [DisplayName("会员密码")]
        [Required(ErrorMessage = "请输入密码")]
        [MaxLength(40, ErrorMessage = "请输入密码")]
        [DataType(DataType.Password)]
        public string Password { get; set; }

        [DisplayName("中文姓名")]
        [Required(ErrorMessage = "请输入中文姓名")]
        [MaxLength(5, ErrorMessage = "中文姓名不可超过5个字")]
        [Description("暂不考虑外国人用英文注册会员的情况")]
        public string Username { get; set; }

        [DisplayName("会员昵称")]
        [Required(ErrorMessage = "请输入会员昵称")]
        [MaxLength(10, ErrorMessage = "会员昵称请勿输入超过10个字")]
        public string Nickname { get; set; }

        [DisplayName("会员注册时间")]
        public DateTime RegisterOn { get; set; }

        [DisplayName("会员启用认证码")]
        [MaxLength(36)]
        [Description("当 AuthCode 等于 null 则代表此会员已经通过Email有效性验证")]
        public string AuthCode { get; set; }
    }
}

using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

namespace MvcTest.Models
{
    public class MemberLoginViewModel
    {
        [DisplayName("会员账号")]
        [DataType(DataType.EmailAddress, ErrorMessage = "请输入您的 Email 地址")]
        [Required(ErrorMessage = "请输入{0}")]
        public string email { get; set; }

        [DisplayName("会员密码")]
        [DataType(DataType.Password)]
        [Required(ErrorMessage = "请输入{0}")]
        public string password { get; set; }
    }
}

控制器部分

using MvcTest.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mail;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;

namespace MvcShopping.Controllers
{
    public class MemberController : Controller
    {
        protected testContext db = new testContext();

        // 会员注册页面
        public ActionResult Register()
        {
            return View();
        }

        // 写入会员资料
        [HttpPost]
        public ActionResult Register([Bind(Exclude="RegisterOn,AuthCode")] Member member)
        {
            // 检查会员是否存在
            var chk_member = db.Members.Where(p => p.Email == member.Email).FirstOrDefault();
            if (chk_member != null)
            {
                ModelState.AddModelError("Email", "您输入的 Email 已经有人注册过了!");
            }

            if (ModelState.IsValid)
            {
                // 会员注册时间
                member.RegisterOn = DateTime.Now;
                // 会员验证码,采用 Guid 当成验证内容,避免有会员使用到重复的验证码
                member.AuthCode = Guid.NewGuid().ToString();

                db.Members.Add(member);
                db.SaveChanges();

                return RedirectToAction("Login", "Member");
            }
            else
            {
                return View();
            }
        }

        private void SendAuthCodeToMember(Member member)
        {
            // 准备发送邮件内容
            string mailBody = System.IO.File.ReadAllText(Server.MapPath("~/App_Data/MemberRegisterEMailTemplate.htm"));

            mailBody = mailBody.Replace("{{Name}}", member.Username);
            mailBody = mailBody.Replace("{{RegisterOn}}", member.RegisterOn.ToString("F"));
            var auth_url = new UriBuilder(Request.Url)
            {
                Path = Url.Action("ValidateRegister", new { id = member.AuthCode }),
                Query = ""
            };
            mailBody = mailBody.Replace("{{AUTH_URL}}", auth_url.ToString());

            // 发送邮件给会员
            try
            {
                SmtpClient SmtpServer = new SmtpClient("smtp.126.com");
                //SmtpServer.Port = 587;
                SmtpServer.Credentials = new System.Net.NetworkCredential("yourname@126.com", "password");
                SmtpServer.EnableSsl = true;

                MailMessage mail = new MailMessage();
                mail.From = new MailAddress("yourname@126.com");
                mail.To.Add(member.Email);
                mail.Subject = "会员注册确认信";
                mail.Body = mailBody;
                mail.IsBodyHtml = true;

                SmtpServer.Send(mail);
            }
            catch (Exception ex)
            {
                throw ex;
                // 发送邮件寄送失败,需记录到数据库备查,以免有会员无法登录
            }
        }

        public ActionResult ValidateRegister(string id)
        {
            if (String.IsNullOrEmpty(id))
                return HttpNotFound();
            
            var member = db.Members.Where(p => p.AuthCode == id).FirstOrDefault();

            if (member != null)
            {
                TempData["LastTempMessage"] = "会员验证成功,您现在可以登入网站了!";
                //邮件点击验证成功后要将 member.AuthCode 的内容清空
                member.AuthCode = null;
                db.SaveChanges();
            }
            else
            {
                TempData["LastTempMessage"] = "查无此会员验证码,您可能已经验证过了!";
            }

            return RedirectToAction("Login", "Member");
        }

        // 显示会员登录页面
        public ActionResult Login(string returnUrl)
        {
            ViewBag.ReturnUrl = returnUrl;

            return View();
        }

        // 执行会员登录
        [HttpPost]
        public ActionResult Login(string email, string password, string returnUrl)
        {
            if (ValidateUser(email, password))
            {
                FormsAuthentication.SetAuthCookie(email, false);

                if (String.IsNullOrEmpty(returnUrl)) {
                    return RedirectToAction("Index", "Home");
                } else {
                    return Redirect(returnUrl);
                }
            }

            return View();
        }

        private bool ValidateUser(string email, string password)
        {
            var hash_pw = password;

            var member = (from p in db.Members
                          where p.Email == email && p.Password == hash_pw
                          select p).FirstOrDefault();

            // 如果 member 模型 null 则代表输入的用户名和密码正确
            if (member != null) {
                if (member.AuthCode == null) {
                    return true;
                } else {
                    ModelState.AddModelError("", "您尚未通过会员验证,请查收邮件点击会员验证链接!");
                    return false;
                }
            } else {
                ModelState.AddModelError("", "您输入的用户名或密码错误!");
                return false;
            }
        }

        // 执行会员注销登录
        public ActionResult Logout()
        {
            // 清除 Cookies
            FormsAuthentication.SignOut();

            // 清除所有曾经写入过的 Session 资料
            Session.Clear();

            return RedirectToAction("Index", "Home");
        }

        [HttpPost]
        public ActionResult CheckDup(string Email)
        {
            var member = db.Members.Where(p => p.Email == Email).FirstOrDefault();

            if (member != null)
                return Json(false);
            else
                return Json(true);
        }

    }
}
视图部分

@model MvcTest.Models.MemberLoginViewModel

<h2>会员登录</h2>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>请输入你的用户名和密码</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.email)
        </div>
        <div class="editor-field">
            @*@Html.EditorFor(model => model.email)*@
            @Html.TextBoxFor(model => model.email, new { data_val_email = "请输入 Email 地址" })
            @Html.ValidationMessageFor(model => model.email)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.password)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.password)
            @Html.ValidationMessageFor(model => model.password)
        </div>

        <p>
            <input type="submit" value="登录" />
        </p>
    </fieldset>
}
<div>
    @Html.ActionLink("注册账号", "Register", "Member")
</div>
@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")

    @if (TempData["LastTempMessage"] != null)
    {
        <script>

        alert('@HttpUtility.JavaScriptStringEncode(Convert.ToString(TempData["LastTempMessage"]))');
        </script>
    }
}
@model MvcTest.Models.Member

<h2>会员注册</h2>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>请输入会员注册资料</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.Email)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Email)
            @Html.ValidationMessageFor(model => model.Email)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Password)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Password)
            @Html.ValidationMessageFor(model => model.Password)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Username)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Username)
            @Html.ValidationMessageFor(model => model.Username)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Nickname)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Nickname)
            @Html.ValidationMessageFor(model => model.Nickname)
        </div>

        <p>
            <input type="submit" value="注册" />
        </p>
    </fieldset>
}

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}
确认邮件模板

<!DOCTYPE html>
<html>
<body>
    <h1>会员注册确认信</h1>
    <p>亲爱的 {{Name}} 您好:</p>
    <p>
        由于您在 {{RegisterOn}} 注册成为本站会员,为了完成会员注册程序,请您点击以下链接用以确认您的Email地址是有效的:
        <br />
        <a href="{{AUTH_URL}}" target="_blank">{{AUTH_URL}}</a>
    </p>
</body>
</html>

本文转载自:http://blog.csdn.net/smartsmile2012/article/details/51635794

深圳大道
粉丝 3
博文 877
码字总数 0
作品 0
深圳
架构师
私信 提问
php热身2:CRUD with Ajax

这次热身是一个会员管理系统,包括会员注册、登录、资料修改功能,使用ajax技术 1.建表 2.数据库连接类 书上没用PDO。但是pdo的封装,因为pdo函数用的不多,没啥经验,就先放放,只搞一个fet...

lovedan
2016/05/15
0
0
【免费】捷微微信管家公众号运营培训开课啦!

捷微微信管家公众号运营培训开课啦!平台账号免费注册,基本配置、微信营销、微网站、微商城和会员卡等功能一律免费使用。快来体验吧(jeewx.com/jeewx)。每周一期,敬请连续关注。 报名地址...

Jeecg
2015/09/06
102
0
EaglePHP v2.5 更新日志

此次更新包括: 框架: 1、添加Behavior行为类增加路由正则匹配替换。 2、模型基类增加判断表名是否存在方法,使用方法:model('table_name')->tableExists(); 3、系统函数库新增正则表达式匹...

maoxiaojian
2013/06/04
1K
1
使用dreamweaver设计常用注册页面表单验证

网页注册页面验证设计,必须使用dreamweaver的表单来实现,或者spry库。这里介绍的第一个是最原始的表单验证方式,即没有使用即时验证,需要点击提交按钮才进行验证,也没有使用正则表达式或...

crossmix
2015/04/24
1K
0
阿里云 App 端注册账号和实名认证教程 新手必看!

如果还没有阿里云账号,可以在阿里云 App 上,使用手机号码注册阿里云账号和完成账号实名认证。并且,后续还可以在阿里云 App 上,管理云资源、监控资源状态、进行身份验证、及上云栖社区咨询...

taller1980
08/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

springboot 403 问题

添加WebAppConfigurer 配置 @Configuration@EnableAutoConfigurationpublic class WebAppConfigurer extends WebMvcConfigurerAdapter { public WebAppConfigurer() { } ......

布袋和尚_爱吃鱼
23分钟前
3
0
Python自动更换壁纸爬虫与tkinter结合

直接上代码 import ctypesimport timeimport requestsimport osfrom threading import Threadfrom tkinter import Tk, Label, Button,Entry,StringVar,messagebox# '放到AppData\Roami......

物种起源-达尔文
24分钟前
3
0
Postgresql Study 笔记

Postgresql 安装 Windows, MAC Install Postgresql 下载地址: https://www.enterprisedb.com/downloads/postgres-postgresql-downloads Linux Install sudo apt-get update sudo apt-get in......

slagga
25分钟前
3
0
layer.open 打开新页面传参问题

如图所示,点击出售,把A页面的数据传到弹框上面,因为弹框比较复杂,所以使用引入一个新页面。 A.html a.js B.html b.js 1、第一种方案 sellInte: function (){ var obj = document.g...

木九天
28分钟前
4
0
沙龙报名 | 区块链数据服务技术应用实践

京东云是国内首家提供区块链数据在线分析服务产品的公司,也是行业内首家对区块链数据服务进行开源的公司。 本次沙龙是京东云BDS开源后,首次在深圳举办线下沙龙,我们将邀请京东云BDS团队核...

京东云技术新知
29分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部