/// <summary>
        /// 尝试创建用户,并发送注册邮件到用户邮箱
        /// </summary>
        /// <param name="registerUser"></param>
        /// <param name="roleType"></param>
        /// <returns></returns>
        private async Task <ValueTuple <bool, MoUserInfo> > TryCreateUser(MoUserInfoSimple registerUser, RoleType roleType)
        {
            if (registerUser == null)
            {
                throw new ArgumentNullException(nameof(registerUser));
            }

            // 因为我们要考虑到已经入库了但邮箱还未激活的用户(也就是还未完成全部注册流程的用户)可能会重复注册,所以我这里改成这样子
            User user = _uf.UserRepository.GetFirstOrDefault(x => x.Email.Equals(registerUser.UserName, StringComparison.OrdinalIgnoreCase));

            if (user == null)
            {
                using (var trans = _uf.BeginTransaction())
                {
                    try
                    {
                        user = await _uf.UserRepository.CreateUserAsync(registerUser);

                        //_uf.SaveChanges();
                        var role = await _uf.RoleRepository.GetOrAddAsync(roleType);

                        //_uf.SaveChanges();
                        var userToRole = new UserToRole
                        {
                            UserId = user.Id,
                            RoleId = role.Id
                        };

                        await _uf.UserToRoleRepository.InsertAsync(userToRole);

                        await _uf.SaveChangesAsync();

                        trans.Commit();
                    }
                    catch (Exception ex)
                    {
                        trans.Rollback();
                        this.MsgBox("注册用户失败");
                        return(false, null);
                    }
                }
            }

            var userInfo = new MoUserInfo
            {
                Id         = user.Id,
                UserStatus = (int)user.UserStatus,
                Email      = user.Email,
                HeadPhoto  = user.HeadPhoto,
                UserName   = user.UserName,
                Roles      = roleType.ToString()
            };

            HttpContext.AddUserInfo(userInfo);
            this.MsgBox("注册用户成功,请查看您的邮箱,确认激活!");
            return(true, userInfo);
        }
Exemple #2
0
 private User CreateUserInstance(MoUserInfoSimple registerUser)
 {
     return(new User
     {
         UserName = registerUser.UserName,
         Email = registerUser.UserName,
         Password = CryptHelper.GetMd5Value(registerUser.UserPwd),
         UserStatus = UserStatus.禁用,
         HeadPhoto = "../../wwwroot/images/gutsmvc.png",
         Sex = false
     });
 }
Exemple #3
0
        public async Task <User> CreateUserAsync(MoUserInfoSimple registerUser)
        {
            if (registerUser == null)
            {
                throw new ArgumentNullException(nameof(registerUser));
            }

            var user = CreateUserInstance(registerUser);

            await InsertAsync(user);

            return(user);
        }
Exemple #4
0
        public User CreateUser(MoUserInfoSimple registerUser)
        {
            if (registerUser == null)
            {
                throw new ArgumentNullException(nameof(registerUser));
            }

            var user = CreateUserInstance(registerUser);

            Insert(user);

            return(user);
        }
        public async Task <IActionResult> ConfirmPassword(MoUserInfoSimple registerUser)
        {
            if (ModelState.IsValid == false)
            {
                this.MsgBox("验证失败!");
                return(View(registerUser));
            }

            if (string.IsNullOrWhiteSpace(registerUser.UserPwd))
            {
                this.MsgBox("密码不能为空!");
                return(View(registerUser));
            }
            else if (string.IsNullOrWhiteSpace(registerUser.ComfirmPwd))
            {
                this.MsgBox("确认密码不能为空!");
                return(View(registerUser));
            }
            else if (registerUser.UserPwd != registerUser.ComfirmPwd)
            {
                this.MsgBox("密码和确认密码不相同!");
                return(View(registerUser));
            }

            var key = $"checkConfirmPwd{registerUser.UserName}";

            if (!_cache.TryGetValue <MoUserInfo>(key, out var checkUser))
            {
                return(Redirect("http://localhost:17758/home/error/?msg=请求已过期,请重新操作!"));
            }

            using (_uf)
            {
                var user = await _uf.UserRepository.GetAsync(b => b.Id == checkUser.Id && b.Email == checkUser.Email);

                if (user == null)
                {
                    _cache.Remove(key);
                    return(Redirect("http://localhost:17758/home/error/?msg=重置的密码失败,请稍后重试!"));
                }

                user.Password = CryptHelper.GetMd5Value(registerUser.UserPwd.Trim());
                var result = await _uf.SaveChangesAsync();

                _cache.Remove(key);
                this.MsgBox("重置密码成功!");
            }

            return(View());
        }
        public async Task <IActionResult> Register(MoUserInfoSimple registerUser)
        {
            if (!ModelState.IsValid || registerUser == null)
            {
                this.MsgBox("验证失败,请稍后重试");
                return(View(registerUser));
            }

            var(result, userInfo) = await TryCreateUser(registerUser, RoleType.User);

            if (!result)
            {
                return(View());
            }

            var timeOut = 5;
            var now     = DateTime.Now.AddMinutes(timeOut).Ticks; // 设置过期时间
            var expires = now.ToString();
            var token   = CryptHelper.GetMd5Value($"{expires}-{new Random().Next()}");

            // 发送密码通知的URL
            var appUrl     = $"http://{HttpRequest.UserHostName}";
            var comfirmUrl = $"{appUrl}/member/activeemail/?expire={expires}&token={token}&email={userInfo.UserName}";

            // 读取模板
            var tpl = await HtmlTplHelper.GetHtmlTpl(EmailTpl.SettingEmail, _mapSetting.EmailTplPath);

            if (String.IsNullOrWhiteSpace(tpl))
            {
                this.MsgBox("发送绑定邮件失败,请稍后重试。");
                return(View());
            }

            tpl = tpl.Replace("{name}", "尊敬的用户")
                  .Replace("{content}", $"您正在使用<a href='{appUrl}'>GutsMvcBBS</a>邮件激活功能,请点击以下链接确认绑定邮箱<a href='{comfirmUrl}'>Click here</a>;注意该地址在{timeOut}分钟内有效。");

            // 发送邮件
            var isOk = EmailHelper.SendEmail(
                new Dictionary <string, string> {
                { "尊敬的用户", userInfo.UserName }
            },
                "GutsMvcBBS - 邮箱激活",
                tpl);

            this.MsgBox(isOk ? "已给您邮箱发送了账号激活邮件,请收件后点击链接地址。" : "发送绑定邮件失败,请稍后重试!");

            return(View());
        }
        public async Task <IActionResult> ModifyPwd(MoUserInfoSimple moUserInfoSimple)
        {
            HttpContext.TryGetUserInfo(out var userInfo);
            ViewData["HeadPhoto"] = userInfo.HeadPhoto;
            ViewData["UserName"]  = userInfo.UserName;
            ViewData["Role"]      = userInfo.Roles.ToLower();
            if (!ModelState.IsValid)
            {
                this.MsgBox("密码格式错误");
                return(View(moUserInfoSimple));
            }

            try
            {
                var user = await _uf.UserRepository.GetByIdAsync(userInfo.Id);

                if (user == null)
                {
                    this.MsgBox("修改密码失败!请稍后重试");
                    return(View(moUserInfoSimple));
                }

                var password = CryptHelper.GetMd5Value(moUserInfoSimple.UserPwd.Trim());
                if (user.Password == password)
                {
                    this.MsgBox("新密码不能与旧密码相同!");
                    return(View(moUserInfoSimple));
                }

                user.Password = password;
                var result = await _uf.SaveChangesAsync();

                if (result > 0)
                {
                    this.MsgBox("修改成功");
                }
                else
                {
                    this.MsgBox("修改失败");
                }
            }
            catch (Exception ex)
            {
                this.MsgBox("修改失败");
            }

            return(View(moUserInfoSimple));
        }