/// <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); }
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 }); }
public async Task <User> CreateUserAsync(MoUserInfoSimple registerUser) { if (registerUser == null) { throw new ArgumentNullException(nameof(registerUser)); } var user = CreateUserInstance(registerUser); await InsertAsync(user); return(user); }
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)); }