UE5.4 EOS initialization problem - PreferredUniqueNetId is not valid

I have a project that uses the EOS Online Subsystem on UE5.4. The ULocalPlayer::GetPreferredUniqueNetId() function always returns an invalid PreferredUniqueNetId.

Here is the relavent code:

int UMultiplayerSessionsSubsystem::CreateSession(int32 NumPublicConnections, FString MatchType, FString PathToLobby_)
{
	if (!OnlineSessionInterface.IsValid())
	{
		return -1;
	}

	PathToLobby = PathToLobby_;

	auto ExistingSession = OnlineSessionInterface->GetNamedSession(NAME_GameSession);
	if (ExistingSession != nullptr)
	{
		OnlineSessionInterface->DestroySession(NAME_GameSession);
	}

	OnlineSessionInterface->AddOnCreateSessionCompleteDelegate_Handle(CreateSessionCompleteDelegate);

	TSharedPtr<FOnlineSessionSettings> SessionSettings = MakeShared<FOnlineSessionSettings>();
	if (!SessionSettings.IsValid())
	{
		return -1;
	}
	SessionSettings->bIsDedicated = false;
	SessionSettings->bIsLANMatch = false;
	SessionSettings->NumPublicConnections = NumPublicConnections;
	SessionSettings->bAllowJoinInProgress = true;
	SessionSettings->bAllowJoinViaPresence = true;
	SessionSettings->bShouldAdvertise = true;
	SessionSettings->bUsesPresence = true;
	SessionSettings->bUseLobbiesIfAvailable = true;
	SessionSettings->bUseLobbiesVoiceChatIfAvailable = true;
	SessionSettings->bAllowInvites = true;
	SessionSettings->Set(FName("MatchType"), MatchType, EOnlineDataAdvertisementType::ViaOnlineServiceAndPing);

	UWorld* World = GetWorld();
	if (World == nullptr)
	{
		return -1;
	}
	const ULocalPlayer* LocalPlayer = World->GetFirstLocalPlayerFromController();
	if (LocalPlayer == nullptr)
	{
		return -1;
	}
	FUniqueNetIdRepl PreferredUniqueNetId = LocalPlayer->GetPreferredUniqueNetId();
	if (!PreferredUniqueNetId.IsValid())
	{
		if (GEngine)
		{
			GEngine->AddOnScreenDebugMessage(
				-1,
				15.f,
				FColor::Red,
				FString(TEXT("PreferredUniqueNetId is invalid"))
			);
		}
		UE_LOG(LogTemp, Error, TEXT("PreferredUniqueNetId is invalid"));
		return -1;
	}
	if (!OnlineSessionInterface->CreateSession(*PreferredUniqueNetId, NAME_GameSession, *SessionSettings))
	{
		if (GEngine)
		{
			GEngine->AddOnScreenDebugMessage(
				-1,
				15.f,
				FColor::Red,
				FString(TEXT("Failed to create session!"))
			);
		}
		UE_LOG(LogTemp, Warning, TEXT("Failed to create session!"));
		return -1;
	}
	return 0;
}

It always runs into the invalid block. Here is the debugging screen:

I wonder why it is always invalid.