Произошла локальная ошибка при подключении к AD на сервере Windows 2008 - PullRequest
4 голосов
/ 05 октября 2009

На сервере Windows 2000 Advanced имеется Active Directory, у меня есть веб-сервер на Windows 2008 server Enterprise Edition, следующий код прекрасно работает на сервере Winsows 2003, но когда я установил сервер Win 2008, он выдает следующую ошибку, веб-сервер не является поддоменом сервера AD. но они имеют одинаковый диапазон IP-адресов.

Произошла локальная ошибка.

System.DirectoryServices.DirectoryServicesCOMException

Я хочу аутентифицироваться через AD с моего веб-сервера, я даже тестировал порт 389, и он был открыт (по telnet), я даже добавил порт 389 UDP и TCP к брандмауэру веб-сервера, чтобы убедиться, что он открыт, даже если я включил брандмауэр выключен, но ничего не изменилось. Я не знаю, что не так с сервером Windows 2008, который не может запустить мой код, я ищу в Интернете, но ничего не нашел. любое решение было бы полезно. Спасибо

public bool IsAuthenticated(string username, string  pwd,string group)
{
  string domainAndUsername = "LDAP://192.xx.xx.xx:389/DC=test,DC=oc,DC=com" ;
  string usr="CN=" + username + ",CN=" + group;
  DirectoryEntry entry = new DirectoryEntry(domainAndUsername, usr, pwd,
                                            AuthenticationTypes.Secure );

  try
  {
    DirectorySearcher search = new DirectorySearcher(entry);

    search.Filter = "(SAMAccountName=" + username + ")";

    SearchResult result = search.FindOne();

    if (result == null)
    {
        return false;
    }
  }
  catch (Exception ex)
  {
      return false;
  }
  return true;
}

Ответы [ 3 ]

4 голосов
/ 12 октября 2009

Хорошо, давайте попробуем другой подход ... Вы указали, что находитесь в Windows 2008, что означает, что вы должны иметь возможность использовать новое пространство имен System.DirectoryServices.AccountManagement, представленное в .NET 3.5.

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

using System.DirectoryServices.AccountManagement;

//...

private Boolean IsAuthenticated(String username, String password, String group)
{
  PrincipalContext domain;
  try
  {
    // Connect to the domain:
    domain = new PrincipalContext(ContextType.Domain, "192.xx.xx.xx", username, password);
  }
  catch
  {
    // Unable to connect to the domain (connection error or bad username/password):
    return false;
  }

  PrincipalSearcher searcher = new PrincipalSearcher();

  // Search for the user in the domain:
  UserPrincipal findUser = new UserPrincipal(domain);
  findUser.SamAccountName = username;
  searcher.QueryFilter = findUser;
  UserPrincipal foundUser = (UserPrincipal)searcher.FindOne();

  // Search for the group in the domain:
  GroupPrincipal findGroup = new GroupPrincipal(domain);
  findGroup.SamAccountName = group;
  searcher.QueryFilter = findGroup;
  GroupPrincipal foundGroup = (GroupPrincipal)searcher.FindOne();

  if (foundGroup != null)
  {
    // Return true if group exists and the user is a member:
    return foundUser.IsMemberOf(foundGroup);
  }
  else
  {
    // Group was not found:
    return false;
  }
}

Однако я бы порекомендовал вам настроить служебную учетную запись в своем домене и использовать эту учетную запись (с вашим известным паролем) в своем приложении, а не подключаться к каталогу с именем пользователя / паролем пользователя, которого вы используете. autenticating.

1 голос
/ 22 июля 2010

Класс DirectorySearcher, скорее всего, виновник.

За MSDN на DirectorySearcher:

"Windows 7, Windows Vista SP1 или более поздняя версия, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (роль сервера не поддерживается ), Windows Server 2008 R2 (Server Core Роль не поддерживается) , Windows Server 2003 SP2

.NET Framework поддерживает не все версии каждой платформы. Список поддерживаемых версий см. В разделе Системные требования .NET Framework. «

0 голосов
/ 06 октября 2009

Полученная ошибка указывает на то, что вы можете получить доступ к Active Directory (не проблема с брандмауэром), но AD не может обработать запрос.

Я не уверен, почему код работал на Server 2003, потому что эти две строки ...

string usr="CN=" + username + ",CN=" + group;
DirectoryEntry entry = new DirectoryEntry(domainAndUsername, usr, pwd,  AuthenticationTypes.Secure );  

... никогда не должно работать, потому что вы неправильно вводите имя пользователя (вы не можете просто добавить имя пользователя к имени группы, это не допустимый DN). Если вы измените его на ...

DirectoryEntry entry = new DirectoryEntry(domainAndUsername, username, pwd,  AuthenticationTypes.Secure );

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

...