/// <summary>
        /// Checks the validity of this configuration.
        /// </summary>
        /// <param name="monitor">The monitor that will log warnings and errors.</param>
        /// <returns>True on success, false if the configuration is not valid and should not be used.</returns>
        public virtual bool CheckValid(IActivityMonitor monitor)
        {
            bool success = RemotePartyConfiguration.ValidateName(monitor, nameof(DomainName), DomainName, false);

            success &= RemotePartyConfiguration.ValidateName(monitor, nameof(EnvironmentName), EnvironmentName, false);
            if (ClockSkew < TimeSpan.FromSeconds(1) || ClockSkew > TimeSpan.FromHours(8))
            {
                monitor.Error($"ClockSkew must be between 1 second and 8 hour. (Value: {ClockSkew:c})");
                success = false;
            }
            if (MinSignatureDuration < TimeSpan.FromSeconds(1))
            {
                monitor.Error($"MinSignatureLifetime must be at least 1 second. (Value: {MinSignatureDuration:c})");
                success = false;
            }
            if (MaxSignatureDuration < MinSignatureDuration)
            {
                monitor.Error($"MaxSignatureLifetime ({MaxSignatureDuration:c}) must be greater than MinSignatureLifetime ({MinSignatureDuration:c}).");
                success = false;
            }
            success &= Local.CheckValid(monitor);
            foreach (var t in TrustedParties)
            {
                success &= t.CheckValid(monitor, EnvironmentName);
            }
            if (success)
            {
                Debug.Assert(Local.Name != null);
                HashSet <string> partyNames = new HashSet <string>();
                partyNames.Add(Local.Name);
                foreach (var p in TrustedParties)
                {
                    Debug.Assert(p.Name != null);
                    if (!partyNames.Add(p.Name))
                    {
                        monitor.Error($"Party Name '{p}' is already used. Names must be unique.");
                        success = false;
                    }
                }
            }
            return(success);
        }