/// <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));
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
        /// <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));
        }
Beispiel #7
0
        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));
        }