Имена серверов не могут содержать пробелов
У меня есть приложение 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
Ваш единственный вариант-отладить код и исследовать значение переменной, содержащей имя сервера.