Учитывая идентификатор пользователя, пароль и имя субдомена, как я могу получить доменное имя верхнего уровня для учетной записи пользователя? - PullRequest
0 голосов
/ 03 мая 2018

Я пишу программу (WinForms, C#), которая работает на клиентской машине Win 7. Он получает учетные данные от пользователя (идентификатор пользователя, пароль и имя субдомена) и использует их для аутентификации (через Active Directory) на других серверах, к которым программа удаленно подключается. Другие серверы находятся в домене, отличном от домена, на котором находится клиентский компьютер Win 7.

Используя классы NetworkCredential, LdapDirectoryIdentifier и LdapConnection, я могу проверить учетные данные, используя не более чем идентификатор пользователя, пароль и имя субдомена (см. Ответ для SO Почему Active Directory проверяет последний пароль? ).

Например, для учетной записи пользователя ssmith@xyz.gov мне нужно предоставить только ssmith (идентификатор пользователя), пароль для ssmith и xyz (subdomain). Мне не нужно предоставлять top-level domain name (gov в данном случае).

Теперь я хочу программно получить top-level domain name для этой учетной записи пользователя (gov в данном случае). Я изучил свойства и методы классов NetworkCredential, LdapDirectoryIdentifier и LdapConnection. Я просмотрел другие классы в пространстве имен System.DirectoryServices.Protocols . Я не вижу способа программно получить top-level domain name.

Учитывая user id, password и subdomain имя, как я могу получить top-level domain name для учетной записи пользователя?

Вот мой код. Учитывая учетную запись пользователя ssmith@xyz.gov, Мой вызов выглядит следующим образом (звездочки представляют пароль SecureString)

bool result = ValidateCredentials("ssmith","******", "xyz");

Вот мой код метода.

private const int ERROR_LOGON_FAILURE = 0x31;

private bool ValidateCredentials(string username, SecureString ssPassword, string domain)
{

    //suports secure string 
    NetworkCredential credentials = new NetworkCredential(username, ssPassword, domain);

    LdapDirectoryIdentifier id = new LdapDirectoryIdentifier(domain);

    using (LdapConnection connection = new LdapConnection(id, credentials, AuthType.Kerberos))
    {
        connection.SessionOptions.Sealing = true;
        connection.SessionOptions.Signing = true;

        try
        {
            // The only way to test credentials on a LDAP connection seems to be to attempt a 
            // Bind operation, which will throw an exception if the credentials are bad
            connection.Bind();
        }
        catch (LdapException lEx)
        {
            credentials = null;
            id = null;

            if (ERROR_LOGON_FAILURE == lEx.ErrorCode)
            {
                return false;
            }

            throw;
        }
    }

    credentials = null;
    id = null;

    return true;
}

1 Ответ

0 голосов
/ 03 мая 2018

После успешного связывания полное DNS-имя домена будет в объекте LdapConnection:

var domain = connection.SessionOptions.DomainName;

В этом случае это будет "xyz.gov". Если вам нужно просто «gov», то вы можете просто взять все после последней точки:

var tld = domain.Substring(domain.LastIndexOf('.') + 1);
...