Имена серверов не могут содержать пробел - PullRequest
0 голосов
/ 28 мая 2020

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

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

с трассировкой стека:

    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();
    }

И для извлечения из базы данных я использую (не работает):

    [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;
   }

из метода расширения:

    public static string RemoveWhitespace(string input)
    {
        return new string(input.ToCharArray()
            .Where(c => !Char.IsWhiteSpace(c))
            .ToArray());
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...