/// <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); }
public override void OnActionExecuting(ActionExecutingContext context) { _MyUserInfo = context.HttpContext.Session.Get <MoUserInfo>(context.HttpContext.Session.SessionKey()); if (_MyUserInfo == null) { context.Result = new RedirectToActionResult(nameof(MemberController.Login), "Member", new { ReturnUrl = context.HttpContext.Request.Path }); } ViewData["MyUserInfo"] = _MyUserInfo; base.OnActionExecuting(context); }
public async Task <IActionResult> Login(MoLoginUser loginUser) { if (ModelState.IsValid == false || loginUser == null) { this.MsgBox("验证失败,请重试!"); return(View()); } User user; user = await _uf.UserRepository.GetUser(loginUser.UserName, loginUser.UserPwd); if (user == null) { this.MsgBox("账号或密码错误!"); return(View(typeof(MoLoginUser), loginUser)); } else if (user.UserStatus == UserStatus.未登录) { this.MsgBox("该账号已被禁用,或许你可以尝试重新注册一个账号!"); return(View()); } user.UserStatus = (int)UserStatus.启用; _uf.UserRepository.Update(user); var userToRole = _uf.UserToRoleRepository.GetAll(x => x.UserId == user.Id); await _uf.SaveChangesAsync(); var userInfo = new MoUserInfo { Id = user.Id, UserName = user.UserName, Email = user.Email, HeadPhoto = user.HeadPhoto, UserStatus = (int)user.UserStatus, Roles = userToRole.Any(x => x.Role.RoleName.Equals(RoleType.SuperAdmin.ToString(), StringComparison.OrdinalIgnoreCase)) ? RoleType.SuperAdmin.ToString() : userToRole.Any(x => x.Role.RoleName.Equals(RoleType.Admin.ToString(), StringComparison.OrdinalIgnoreCase)) ? RoleType.Admin.ToString() : RoleType.User.ToString() }; HttpContext.AddUserInfo(userInfo); if (String.IsNullOrWhiteSpace(loginUser.ReturnUrl)) { return(Redirect("http://localhost:17758/home/index")); } else { return(Redirect(loginUser.ReturnUrl)); } }
public async Task <IActionResult> ModifyUser(MoUserInfo moUserInfo) { if (moUserInfo.Id <= 0) { this.MsgBox("修改失败,请稍后重试。"); return(View(_MyUserInfo)); } else if (string.IsNullOrWhiteSpace(moUserInfo.NickName)) { this.MsgBox("昵称不能为空!"); return(View(_MyUserInfo)); } _MyUserInfo.NickName = moUserInfo.NickName; _MyUserInfo.Tel = moUserInfo.Tel; _MyUserInfo.Sex = moUserInfo.Sex; _MyUserInfo.Birthday = moUserInfo.Birthday; _MyUserInfo.Blog = moUserInfo.Blog; _MyUserInfo.Introduce = moUserInfo.Introduce; var user = _db.ToUserInfo.Where(b => b.Id == _MyUserInfo.Id).SingleOrDefault(); if (user == null) { this.MsgBox("修改失败,请稍后重试"); return(View(_MyUserInfo)); } user.NickName = _MyUserInfo.NickName; user.Tel = _MyUserInfo.Tel; user.Sex = _MyUserInfo.Sex; user.Birthday = _MyUserInfo.Birthday; user.Blog = _MyUserInfo.Blog; user.Introduce = _MyUserInfo.Introduce; var result = await _db.SaveChangesAsync(); if (result > 0) { HttpContext.Session.Set <MoUserInfo>(HttpContext.Session.SessionKey(), _MyUserInfo); this.MsgBox("修改成功!"); } else { this.MsgBox("修改失败,请稍后重试!"); } return(View(_MyUserInfo)); }
public static void AddUserInfo(this HttpContext httpContext, MoUserInfo userInfo) { if (userInfo == null) { throw new System.ArgumentNullException(nameof(userInfo)); } var cookie = new Cookie(httpContext.CookieKey(), Newtonsoft.Json.JsonConvert.SerializeObject(userInfo).Replace(",", "&&")) { Expires = DateTime.Now.AddDays(30), Path = "/" }; httpContext.Response.Cookies.Add(cookie); httpContext.Session.Set <MoUserInfo>(httpContext.SessionKey(), userInfo); }
/// <summary> /// 用户抢购商品列表 /// </summary> /// <returns></returns> public async Task <IActionResult> Index() { #region 使用ip模拟登录账号 var token = "Sid_" + HttpContext.Connection.RemoteIpAddress.ToString(); var sessionData = await _redis.Get <MoUserInfo>(token); if (sessionData == null || sessionData.UserId <= 0) { //用户基本信息 var moUser = new MoUserInfo(); moUser.UserId = await DataKeyHelper.Current.GetKeyId(EnumHelper.EmDataKey.UserId); moUser.NickName = token; //redis存储session,默认30分钟失效 var isLogin = await _redis.Set <MoUserInfo>(token, moUser, 30); if (isLogin) { ViewData["MoUser"] = moUser; //加入cookie Response.Cookies.Append(EnumHelper.EmDataKey.SessionKey.ToString(), token, new Microsoft.AspNetCore.Http.CookieOptions { Expires = DateTime.Now.AddMinutes(30), HttpOnly = true }); } } else { ViewData["MoUser"] = sessionData; //已经是登陆状态,需要重新设置失效时间 var isLogin = await _redis.Set <MoUserInfo>(token, sessionData, 30); Response.Cookies.Append(EnumHelper.EmDataKey.SessionKey.ToString(), token, new Microsoft.AspNetCore.Http.CookieOptions { Expires = DateTime.Now.AddMinutes(30), HttpOnly = true }); } #endregion //商品列表 var shoppings = await _redis.GetHashsToList <MoShopping>(EnumHelper.EmDataKey.ShoppingHash.ToString()); Response.Headers.Add("PageCache-Time", $"{60 * 2}"); //2分钟 return(View(shoppings)); }
public static bool TryGetUserInfo(this HttpContext httpContext, out MoUserInfo userInfo) { var cookieValue = httpContext.Request.Cookies[httpContext.CookieKey()]; if (cookieValue == null) { userInfo = httpContext.Session.Get <MoUserInfo>(httpContext.SessionKey()); return(userInfo != null); } var serializer = JsonSerializer.Create(); using (var sr = new StringReader(cookieValue.Value.Replace("&&", ","))) { try { userInfo = serializer.Deserialize <MoUserInfo>(new JsonTextReader(sr)); } catch { httpContext.Request.Cookies.Remove(httpContext.CookieKey()); userInfo = null; } } if (userInfo == null) { userInfo = httpContext.Session.Get <MoUserInfo>(httpContext.SessionKey()); } if (userInfo == null) { return(false); } if (httpContext.Response.Cookies.Get(httpContext.CookieKey()) == null) { httpContext.Response.Cookies.Add(new Cookie(httpContext.CookieKey(), cookieValue.Value) { Expires = DateTime.Now.AddDays(30), Path = "/" }); } return(true); }
private IPrincipal GetPrincipal(MoUserInfo userInfo) { var claims = new List <Claim>(); foreach (var role in userInfo.Roles.Trim().Split(',')) { if (!String.IsNullOrWhiteSpace(role)) { claims.Add(new Claim(ClaimTypes.Role, role)); } } var identity = new ClaimsIdentity(claims, userInfo.Id.ToString()); var principal = new ClaimsPrincipal(identity); Thread.CurrentPrincipal = principal; return(principal); }
public override async Task OnContentedAsync() { if (!HttpContext.Request.IsWebSocketRequest) { await OnDisconnectedAsync(false); } if (!HttpContext.TryGetUserInfo(out var userInfo) || userInfo == null) { await OnDisconnectedAsync(false); } var initResult = await this.InitChatAsync(userInfo.Id, _targetUserId); if (!initResult) { await OnDisconnectedAsync(false); } _userInfo = userInfo; }
public async Task <IActionResult> ActiveEmail(string expire, string token, string email) { email = email.Trim(); if (String.IsNullOrWhiteSpace(expire) || String.IsNullOrWhiteSpace(token) || String.IsNullOrWhiteSpace(email)) { return(Redirect("http://*****:*****@"^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$").IsMatch(email) == false) { return(RedirectToAction("home", "error", new Dictionary <string, object> { { "msg", "邮箱格式不合法,请仔细甄别您的邮箱是否正确" } })); } else if (!long.TryParse(expire, out var longNum)) { return(RedirectToAction("home", "error", new Dictionary <string, object> { { "msg", "无效的请求" } })); } else if (longNum < DateTime.Now.Ticks) { return(RedirectToAction("home", "error", new Dictionary <string, object> { { "msg", "请求已过期,请重新请求发送激活邮箱" } })); } var user = await _uf.UserRepository.GetAsync(x => x.UserName == email); if (user == null) { return(RedirectToAction("home", "error", new Dictionary <string, object> { { "msg", "不存在该邮箱指定的账号" } })); } else if (user.UserStatus == (int)UserStatus.启用) { return(RedirectToAction("home", "index")); } var key = $"activeEmail{email}"; user.Email = email; user.UserStatus = (int)UserStatus.启用; _uf.UserRepository.Update(user); await _uf.SaveChangesAsync(); var userInfo = new MoUserInfo { Id = user.Id, UserName = user.UserName, UserStatus = (int)user.UserStatus, Email = user.Email, HeadPhoto = user.HeadPhoto, Roles = RoleType.User.ToString() }; HttpContext.AddUserInfo(userInfo); return(RedirectToAction("home", "index")); }
public async Task <IActionResult> Login([Bind("UserName,UserPwd,ReturnUrl")] MoLoginUser loginUser) { if (ModelState.IsValid) { #region 验证 var md5Pwd = PublicClass._Md5(loginUser.UserPwd.Trim()); var userInfo = await _context.ToUserInfo.SingleOrDefaultAsync(b => b.UserName.Equals(loginUser.UserName, StringComparison.CurrentCultureIgnoreCase) && b.UserPwd.Equals(md5Pwd)); if (userInfo == null) { this.MsgBox("账号或密码错误!"); return(View(loginUser)); } else if (userInfo.Status == (int)EnumHelper.EmUserStatus.禁用) { this.MsgBox("该账号已被禁用,或许你可以尝试重新注册一个账号!"); return(View(loginUser)); } #endregion #region 更新登录信息 userInfo.Ips = this.GetUserIp(); userInfo.LoginTime = DateTime.Now; userInfo.LevelNum += (int)EmLevelNum.登录; //记录session var moUserInfo = new MoUserInfo { Id = userInfo.Id, UserName = userInfo.UserName, NickName = userInfo.NickName, Addr = userInfo.Addr, Birthday = userInfo.Birthday, Blog = userInfo.Blog, CreateTime = userInfo.CreateTime, Email = userInfo.Email, HeadPhoto = userInfo.HeadPhoto, Introduce = userInfo.Introduce, Ips = userInfo.Ips, LevelNum = userInfo.LevelNum, Sex = userInfo.Sex, Tel = userInfo.Tel, Status = userInfo.Status, LoginTime = Convert.ToDateTime(userInfo.LoginTime) }; HttpContext.Session.Set <MoUserInfo>(HttpContext.Session.SessionKey(), moUserInfo); if (!string.IsNullOrWhiteSpace(moUserInfo.Ips)) { _context.ToUserLog.Add(new ToUserLog { CodeId = (int)EmLogCode.登录, CreateTime = DateTime.Now, Des = $"IP:{moUserInfo.Ips},登录时间:{moUserInfo.LoginTime.ToString("yyyy-MM-dd HH:mm")}", UserId = userInfo.Id }); } _context.ToUserLog.Add(new ToUserLog { CodeId = (int)EmLogCode.积分, CreateTime = DateTime.Now, Des = $"【登录】 +{(int)EmLevelNum.登录}", UserId = userInfo.Id }); await _context.SaveChangesAsync(); if (string.IsNullOrWhiteSpace(loginUser.ReturnUrl)) { return(RedirectToAction(nameof(HomeController.Index), "Home")); } else { return(Redirect(loginUser.ReturnUrl)); } #endregion } return(View(loginUser)); }
public async Task <IActionResult> Register([Bind("UserName,UserPwd,ComfirmPwd")] MoRegisterUser loginUser) { if (ModelState.IsValid) { #region 验证 if (_context.ToUserInfo.Any(b => b.UserName.ToUpper() == loginUser.UserName.Trim().ToUpper())) { this.MsgBox("已经存在相同的账号!"); return(View(loginUser)); } #endregion #region 入库 ToUserInfo userInfo = new ToUserInfo(); userInfo.UserName = loginUser.UserName.Trim(); userInfo.UserPwd = PublicClass._Md5(loginUser.UserPwd.Trim()); userInfo.NickName = userInfo.UserName; userInfo.Status = (int)EnumHelper.EmUserStatus.启用; userInfo.CreateTime = DateTime.Now; userInfo.LevelNum = (int)EmLevelNum.注册; userInfo.Ips = this.GetUserIp(); userInfo.HeadPhoto = "/images/ailiutu_user.png"; userInfo.Sex = false; _context.Add(userInfo); var result = await _context.SaveChangesAsync(); if (result > 0) { var moUserInfo = new MoUserInfo { Id = userInfo.Id, UserName = userInfo.UserName, NickName = userInfo.NickName, Addr = userInfo.Addr, Birthday = userInfo.Birthday, Blog = userInfo.Blog, CreateTime = userInfo.CreateTime, Email = userInfo.Email, HeadPhoto = userInfo.HeadPhoto, Introduce = userInfo.Introduce, Ips = userInfo.Ips, LevelNum = userInfo.LevelNum, Sex = userInfo.Sex, Tel = userInfo.Tel, Status = userInfo.Status, LoginTime = DateTime.Now }; HttpContext.Session.Set <MoUserInfo>(HttpContext.Session.SessionKey(), moUserInfo); if (!string.IsNullOrWhiteSpace(moUserInfo.Ips)) { _context.ToUserLog.Add(new ToUserLog { CodeId = (int)EmLogCode.登录, CreateTime = DateTime.Now, Des = $"IP:{moUserInfo.Ips},登录时间:{moUserInfo.LoginTime.ToString("yyyy-MM-dd HH:mm")}", UserId = userInfo.Id }); } _context.ToUserLog.Add(new ToUserLog { CodeId = (int)EmLogCode.积分, CreateTime = DateTime.Now, Des = $"【注册】 +{(int)EmLevelNum.注册}", UserId = userInfo.Id }); await _context.SaveChangesAsync(); return(RedirectToAction(nameof(HomeController.Index), "home")); } #endregion this.MsgBox("注册失败,请稍后重试。"); return(View(loginUser)); } return(View(loginUser)); }
public async Task <IActionResult> UpHeadPhoto([Bind("Id")] MoUserInfo moUserInfo) { var file = Request.Form.Files.Where(b => b.Name == "myHeadPhoto" && b.ContentType.Contains("image")). SingleOrDefault(); if (file == null) { this.MsgBox("请选择上传的头像图片!"); return(View(_MyUserInfo)); } var maxSize = 1024 * 1024 * 4; if (file.Length > maxSize) { this.MsgBox("头像图片不能大于4M!"); return(View(_MyUserInfo)); } var fileExtend = file.FileName.Substring(file.FileName.LastIndexOf('.')); var fileNewName = $"{DateTime.Now.ToString("yyyyMMddHHmmssfff")}{fileExtend}"; var path = Path.Combine(_selfSetting.UpHeadPhotoPath, fileNewName); using (var stream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite)) { await file.CopyToAsync(stream); } //更新数据 var viewPath = $"{_selfSetting.ViewHeadPhotoPath}/{fileNewName}"; var user = _db.ToUserInfo.Where(b => b.Id == _MyUserInfo.Id).SingleOrDefault(); if (user == null) { this.MsgBox("上传失败,请稍后重试!"); return(View(_MyUserInfo)); } user.HeadPhoto = viewPath; user.LevelNum += (int)EmLevelNum.修改头像; var result = await _db.SaveChangesAsync(); if (result > 0) { _MyUserInfo.HeadPhoto = viewPath; _MyUserInfo.LevelNum = user.LevelNum; HttpContext.Session.Set <MoUserInfo>(HttpContext.Session.SessionKey(), _MyUserInfo); this.MsgBox("上传成功!"); _db.ToUserLog.Add(new ToUserLog { CodeId = (int)EmLogCode.积分, CreateTime = DateTime.Now, Des = $"【修改头像】 +{(int)EmLevelNum.修改头像}", UserId = _MyUserInfo.Id }); await _db.SaveChangesAsync(); } else { this.MsgBox("上传失败,请稍后重试!"); } return(View(_MyUserInfo)); }