/// <summary>
        /// Challenges <paramref name="info"/> to identify a guest actor.
        /// Note that a successful challenge may have side effects.
        /// </summary>
        /// <param name="ctx">The call context to use.</param>
        /// <param name="info">The payload to challenge.</param>
        /// <param name="actualLogin">Set it to false to avoid login side effect (such as updating the LastLoginTime) on success.</param>
        /// <returns>The <see cref="LoginResult"/>.</returns>
        public LoginResult LoginGuestActor(ISqlCallContext ctx, IGuestActorInfo info, bool actualLogin = true)
        {
            var mode = actualLogin
                ? UCLMode.UpdateOnly | UCLMode.WithActualLogin
                : UCLMode.UpdateOnly | UCLMode.WithCheckLogin;
            var result = GuestActorUCL(ctx, 1, 0, info, mode);

            return(result.LoginResult);
        }
 protected abstract UCLResult GuestActorUCL(ISqlCallContext ctx, int actorId, int userId, [ParameterSource] IGuestActorInfo info, UCLMode mode);
 /// <summary>
 /// Creates or updates a guest actor entry.
 /// This is the "binding actor feature" since it binds a guest actor to an already existing actor.
 /// When both an <paramref name="guestActorId"/> and <see cref="IGuestActorInfo.Token"/> are provided
 /// they must match otherwise an exception will be thrown.
 /// Otherwise, if no <see cref="IGuestActorInfo.Token"/> is provider then the <paramref name="guestActorId"/>
 /// will be bound to a new guest actor, if no binding currently exists. If no <paramref name="guestActorId"/>
 /// is provided a new one will be created.
 /// </summary>
 /// <param name="ctx">The call context to use.</param>
 /// <param name="actorId">The acting actor identifier.</param>
 /// <param name="guestActorId">The guest actor identifier that must be registered.</param>
 /// <param name="info">Provider specific data: the <see cref="IGuestActorInfo"/> poco.</param>
 /// <param name="mode">Optionally configures Create, Update only or WithLogin behavior.</param>
 /// <returns>The <see cref="UCLResult"/>.</returns>
 public UCLResult CreateOrUpdateGuestActor(ISqlCallContext ctx, int actorId, int guestActorId, IGuestActorInfo info, UCLMode mode = UCLMode.CreateOrUpdate)
 => GuestActorUCL(ctx, actorId, guestActorId, info, mode);