public void Parse_Test()
        {
            var ldapConnectionOptions = new LdapConnectionStringParser().Parse("AuthenticationType=Basic;Connectionless=true;FullyQualifiedDnsHostName=true;Password=P@ssword12;Port=1234;Server=local.net;ProtocolVersion=2;Timeout=10;UserName=User-name");

            Assert.IsNotNull(ldapConnectionOptions);
            Assert.AreEqual(AuthType.Basic, ldapConnectionOptions.AuthenticationType);
            Assert.AreEqual(null, ldapConnectionOptions.Credential.Domain);
            Assert.AreEqual("P@ssword12", ldapConnectionOptions.Credential.Password);
            Assert.AreEqual("User-name", ldapConnectionOptions.Credential.UserName);
            Assert.AreEqual(true, ldapConnectionOptions.DirectoryIdentifier.Connectionless);
            Assert.AreEqual(true, ldapConnectionOptions.DirectoryIdentifier.FullyQualifiedDnsHostName);
            Assert.AreEqual(1234, ldapConnectionOptions.DirectoryIdentifier.Port);
            Assert.AreEqual(1, ldapConnectionOptions.DirectoryIdentifier.Servers.Count);
            Assert.AreEqual("local.net", ldapConnectionOptions.DirectoryIdentifier.Servers.First());
            Assert.AreEqual(2, ldapConnectionOptions.ProtocolVersion);
            Assert.AreEqual(TimeSpan.FromDays(10), ldapConnectionOptions.Timeout);

            ldapConnectionOptions = new LdapConnectionStringParser().Parse("authenticationtype=ntlm;CONNECTIONLESS=false;FullyQuAlIfIeDDnsHostName=true;Password=P@ssword12;Servers=local-1.net,local-2.net,local-3.net;ProtocolVersion=2;Timeout=10;UserName=User-name");
            Assert.IsNotNull(ldapConnectionOptions);
            Assert.AreEqual(AuthType.Ntlm, ldapConnectionOptions.AuthenticationType);
            Assert.AreEqual(null, ldapConnectionOptions.Credential.Domain);
            Assert.AreEqual("P@ssword12", ldapConnectionOptions.Credential.Password);
            Assert.AreEqual("User-name", ldapConnectionOptions.Credential.UserName);
            Assert.AreEqual(false, ldapConnectionOptions.DirectoryIdentifier.Connectionless);
            Assert.AreEqual(true, ldapConnectionOptions.DirectoryIdentifier.FullyQualifiedDnsHostName);
            Assert.IsNull(ldapConnectionOptions.DirectoryIdentifier.Port);
            Assert.AreEqual(3, ldapConnectionOptions.DirectoryIdentifier.Servers.Count);
            Assert.AreEqual("local-1.net", ldapConnectionOptions.DirectoryIdentifier.Servers.ElementAt(0));
            Assert.AreEqual("local-2.net", ldapConnectionOptions.DirectoryIdentifier.Servers.ElementAt(1));
            Assert.AreEqual("local-3.net", ldapConnectionOptions.DirectoryIdentifier.Servers.ElementAt(2));
            Assert.AreEqual(2, ldapConnectionOptions.ProtocolVersion);
            Assert.AreEqual(TimeSpan.FromDays(10), ldapConnectionOptions.Timeout);
        }
        public static IServiceCollection ConfigureDirectory(this IServiceCollection services, IConfiguration configuration, string configurationKey, string connectionStringName)
        {
            if (services == null)
            {
                throw new ArgumentNullException(nameof(services));
            }

            if (configuration == null)
            {
                throw new ArgumentNullException(nameof(configuration));
            }

            services.Configure <DirectoryOptions>(configuration.GetSection(configurationKey));
            services.Configure <LdapConnectionOptions>(options =>
            {
                var connectionOptions       = new LdapConnectionStringParser().Parse(configuration.GetConnectionString(connectionStringName));
                options.AuthenticationType  = connectionOptions.AuthenticationType;
                options.Credential          = connectionOptions.Credential;
                options.DirectoryIdentifier = connectionOptions.DirectoryIdentifier;
                options.ProtocolVersion     = connectionOptions.ProtocolVersion;
                options.Timeout             = connectionOptions.Timeout;
            });

            return(services);
        }
        public static IServiceCollection ConfigureDirectories(this IServiceCollection services, IConfiguration configuration, string configurationKey)
        {
            if (services == null)
            {
                throw new ArgumentNullException(nameof(services));
            }

            if (configuration == null)
            {
                throw new ArgumentNullException(nameof(configuration));
            }

            var directoriesSection = configuration.GetSection(configurationKey);

            foreach (var directorySection in directoriesSection.GetChildren())
            {
                var key = directorySection.Key;
                var connectionStringName = directorySection.GetSection("ConnectionStringName").Value;

                services.Configure <DirectoryOptions>(key, directorySection);
                services.Configure <LdapConnectionOptions>(key, options =>
                {
                    var ldapConnectionOptions   = new LdapConnectionStringParser().Parse(configuration.GetConnectionString(connectionStringName));
                    options.AuthenticationType  = ldapConnectionOptions.AuthenticationType;
                    options.Credential          = ldapConnectionOptions.Credential;
                    options.DirectoryIdentifier = ldapConnectionOptions.DirectoryIdentifier;
                    options.ProtocolVersion     = ldapConnectionOptions.ProtocolVersion;
                    options.Timeout             = ldapConnectionOptions.Timeout;
                });
            }

            return(services);
        }
        public void Parse_IfValueIsWhitespace_ShouldReturnALdapConnectionOptionsInstanceWithoutPropertiesSet()
        {
            var ldapConnectionOptions = new LdapConnectionStringParser().Parse("   ");

            Assert.IsNotNull(ldapConnectionOptions);
            Assert.IsNull(ldapConnectionOptions.AuthenticationType);
            Assert.IsNull(ldapConnectionOptions.Credential);
            Assert.IsNull(ldapConnectionOptions.DirectoryIdentifier);
            Assert.IsNull(ldapConnectionOptions.ProtocolVersion);
            Assert.IsNull(ldapConnectionOptions.Timeout);
        }