Я пишу программу (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;
}