/// <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); } }
/// <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 }); } }
/// <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); }