Tshumore Ответов: 1

Имена серверов не могут содержать пробелов


У меня есть приложение MVC5, в котором пользователь должен войти в систему, используя учетные данные домена. Когда я жестко кодирую значения доменных переменных, приложение входит в систему без проблем. По соображениям безопасности я установил значения переменных в таблице базы данных но когда я пытаюсь получить их с помощью Linq я получаю ошибку Имена серверов не могут содержать пробелов на этой линии :

PrincipalContext ctx = new PrincipalContext(ContextType.Domain, domainControllerService.GetDomain());


с трассировкой стека :
<pre> at System.DirectoryServices.Protocols.LdapDirectoryIdentifier..ctor(String[] servers, Boolean fullyQualifiedDnsHostName, Boolean connectionless)
   at System.DirectoryServices.Protocols.LdapDirectoryIdentifier..ctor(String server)
   at System.DirectoryServices.Protocols.LdapConnection..ctor(String server)
   at System.DirectoryServices.AccountManagement.PrincipalContext.ReadServerConfig(String serverName, ServerProperties& properties)
   at System.DirectoryServices.AccountManagement.PrincipalContext.DoServerVerifyAndPropRetrieval()
   at System.DirectoryServices.AccountManagement.PrincipalContext..ctor(ContextType contextType, String name, String container, ContextOptions options, String userName, String password)
   at System.DirectoryServices.AccountManagement.PrincipalContext..ctor(ContextType contextType, String name)
   at FBChecklist.Controllers.UserController.Login(DomainControllerViewModel model) in C:\Users\tshumae.FBC\source\repos\FBCHECKLIST\FBChecklist\Controllers\UserController.cs:line 49


Это код входа в систему с использованием жестко закодированных значений :
public ActionResult Login()
        {
            var model = new DomainControllerViewModel();
           // LoginViewModel model = new LoginViewModel();
            return View(model);
        }

        // POST: User/Delete/5
        [HttpPost]
        public ActionResult Login(DomainControllerViewModel model)
        {
            try
            {
              PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "MYDOMAIN.CORP");              
                // find a user
                UserPrincipal user = UserPrincipal.FindByIdentity(ctx, model.Username);
                if (user != null)
                {
                    // check user lockout state
                    if (user.IsAccountLockedOut())
                    {
                        ViewBag.Message = "Your account is locked out";
                    }
                    else
                    {
                        bool authentic = false;
                        try
                        {
                            DirectoryEntry entry = new DirectoryEntry("LDAP://XX.XX.XX.XX:XXX/OU=YYY,DC=YYY,DC=corp",, model.Username, model.Password);
                            DirectoryEntry ldapConnection = new DirectoryEntry("MYDOMAIN.CORP");
                            ldapConnection.Path = "LDAP://";
                            ldapConnection.Username ="myusername";
                            ldapConnection.Password = "mypassword";
                            ldapConnection.AuthenticationType = AuthenticationTypes.Secure;
....
....
               
            return View();
        }


А для извлечения из БД im использует :

 [HttpPost]
        public ActionResult Login(DomainControllerViewModel model)
        {
            try
            {
               PrincipalContext ctx = new PrincipalContext(ContextType.Domain, domainControllerService.GetDomain());
  ...
...                           
                        try
                        {

                            DirectoryEntry entry = new DirectoryEntry(domainControllerService.GetDirectoryEntry(), model.Username, model.Password);
                            DirectoryEntry ldapConnection = new DirectoryEntry(domainControllerService.GetDomain());
                            ldapConnection.Path = "LDAP://";
                            ldapConnection.Username =domainControllerService.GetUsername();
                            ldapConnection.Password = domainControllerService.GetPassword();
                            ldapConnection.AuthenticationType = AuthenticationTypes.Secure;
...
...
return View();
}


Репозиторий (DomainControllerService.cs) :
public string GetDomain()
       {
           var domain = (from j in appEntities.DomainControllers
                         select new
                         {
                             j.Domain
                         });
           return domain.ToString();
       }


Что я уже пробовал:

Я попробовал пользовательский метод расширения, который удаляет пробелы из строки, как показано ниже, но я все еще получаю одно и то же исключение :

public string GetDomain()
       {
           var domain = (from j in appEntities.DomainControllers
                         select new
                         {
                             j.Domain
                         });
           string domaintostring = domain.ToString();
           string dom = Helpers.RemoveWhitespace(domaintostring);
           return dom;
       }


а метод :
<pre>public static string RemoveWhitespace(string input)
        {
            return new string(input.ToCharArray()
                .Where(c => !Char.IsWhiteSpace(c))
                .ToArray());
        }

phil.o

Ваш единственный вариант-отладить код и исследовать значение переменной, содержащей имя сервера.

1 Ответов

Рейтинг:
1

Chris Copeland

Как уже упоминалось в комментарии, вы должны отлаживать свой код и пошагово исследовать переменные, чтобы увидеть, какие значения создаются.

Это, как говорится, глядя на нижеследующее:

var domain = (from j in appEntities.DomainControllers
              select new
              {
                  j.Domain
              });
return domain.ToString();

Это, по-видимому, создает IEnumerable<string> и ты тогда звонишь ToString() о перечислимом. Это может быть хорошим местом для начала.