Ahh OK, I made a couple of assumptions here.
Firstly, that when you say you’re spawning the character, you’re just changing the pawn class of that player and respawning their pawn. (Which gets you all the ownership stuff for free without having to do anything). If you’re just spawning an actor manually, and want that actor to be considered to be owned by a particular player, then that actor needs to be ultimately owned by that player’s PlayerController (Call SetOwner). The object doesn’t need to be directly owned by the PlayerController (It can be owned by an object that is itself owned by the PlayerController), but the chain of ownership ultimately has to end with a PlayerController.
I also assumed that another player’s selected character doesn’t really matter to other clients, hence the relevancy suggestion. Generally speaking, if you want a player to know information about another player, the PlayerState is the place to store that.
With regard to uniquely identifying players, unless you have some kind of platform-specific ID for that player (like the ID of their Steam or Epic account), it’s probably better to use the PlayerState. If you use that player’s name, then you’ll likely run into issues further down the road if you want to allow players to change their name in game. (Players could also potentially break the mapping using the setname console command). For GetPlayerState to work on a Pawn though, you’d probably have to use the normal pawn spawning flow, or call SetPlayerState on the Pawn (on the server, so it’s authoritative)