Esempio n. 1
0
        /// <summary>
        /// 作为注册用户登录
        /// </summary>
        /// <param name="userDto">用户信息</param>
        /// <returns>异步获取Token的任务,发生错误时返回错误信息</returns>
        public async Task <(AccessTokenResponseDto, Dictionary <string, string> error)> LoginAsRegisteredUserAsync(UserLoginRequestDto userDto)
        {
            User user = await _dbContext.User
                        .FirstOrDefaultAsync(u => u.Username == userDto.Username);

            if (user != null &&
                ValidatePassword(userDto.Password, user.Salt, user.PasswordHash))
            {
                AccessTokenResponseDto tokenDto = new AccessTokenResponseDto
                {
                    AccessToken  = await _tokenAuthService.GenerateAccessTokenAsync(user),
                    RefreshToken = await _tokenAuthService.GenerateRefreshTokenAsync(user)
                };
                return(tokenDto, null);
            }
            else
            {
                // 用户名或密码错误
                var error = new Dictionary <string, string>
                {
                    ["username"] = _msg.GetMessage("E001", "用户名或密码")
                };

                return(null, error);
            }
        }
Esempio n. 2
0
        /// <summary>
        /// 创建房间
        /// </summary>
        /// <param name="uid">用户ID</param>
        /// <param name="roomDto">用户输入的用于创建房间的信息</param>
        /// <returns>表示异步创建房间的任务,如果创建失败则返回错误信息</returns>
        public async Task <ChatRoomCreateResponseDto> CreateRoomAsync(int uid, ChatRoomDto roomDto)
        {
            // 防止用户打开多个窗口创建房间
            var error = await ApplyForCreatingRoomAsync(uid);

            if (!string.IsNullOrEmpty(error))
            {
                return(new ChatRoomCreateResponseDto
                {
                    Error = error,
                    CloseModalIfError = true
                });
            }
            try
            {
                var room = new ChatRoom
                {
                    OwnerId     = uid,
                    Name        = roomDto.Name,
                    MaxUsers    = roomDto.MaxUsers,
                    IsEncrypted = roomDto.IsEncrypted,
                    IsPermanent = roomDto.IsPermanent,
                    IsHidden    = roomDto.IsHidden,
                    AllowGuest  = roomDto.AllowGuest
                };

                // 如果房间被加密
                if (roomDto.IsEncrypted)
                {
                    Guid salt = Guid.NewGuid();
                    room.Salt         = salt.ToString();
                    room.PasswordHash = PasswordHelper.GeneratePasswordHash(roomDto.Password, room.Salt);
                }

                _dbContext.ChatRoom.Add(room);
                await _dbContext.SaveChangesAsync();

                return(new ChatRoomCreateResponseDto
                {
                    RoomId = HashidsHelper.Encode(room.Id)
                });
            }
            catch (Exception)
            {
                // 因为是多线程,任然可能发生异常
                // 房间名重复
                return(new ChatRoomCreateResponseDto
                {
                    Error = _msg.GetMessage("E003", "房间名"),
                    CloseModalIfError = false
                });
            }
        }
Esempio n. 3
0
        /// <summary>
        /// 验证用户名
        /// </summary>
        /// <param name="username">用户名</param>
        /// <returns>表示异步验证用户名的任务</returns>
        public async Task <string> ValidateUsernameAsync(string username)
        {
            // 用户名仅支持中日英文、数字和下划线,且不能为纯数字
            if (!Regex.IsMatch(username, @"^[\u4e00-\u9fa5\u3040-\u309F\u30A0-\u30FFa-zA-Z_\d]+$") ||
                Regex.IsMatch(username, @"^\d+$"))
            {
                return(_msg.GetMessage("E002", "用户名"));
            }

            // 检测用户名是否存在
            int count = await _dbContext
                        .User.CountAsync(user => user.Username == username);

            if (count > 0)
            {
                return(_msg.GetMessage("E003", "用户名"));
            }
            return(null);
        }