Подтвердить что ты не робот

Доступ к Active Directory из ASP.Net MVC с использованием С#

Мне нужно получить доступ к Active Directory, чтобы получить информацию о группах, к которым принадлежат клиенты. Проект, который у меня есть, - это приложение ASP.Net MVC с использованием С#. Я никогда не запрограммировал Active Directory раньше, и вам нужно знать, как лучше всего начать работу, какую модель безопасности использовать для доступа к информации, и, возможно, указать мне на некоторые полезные уроки.

4b9b3361

Ответ 1

Поскольку вы используете MVC, у вас есть доступ к новому пространству имен System.DirectoryServices.AccountManagement в .NET 3.5. Эти классы должны быть предпочтительнее старых классов в DirectoryServices, поскольку они намного проще в использовании. Есть пара исправлений, которые не были решены в 3.5 (ограничение 1500 членов при опросе групп, например), но я уверен, что они были исправлены в .NET 4.0. Для большинства задач новые классы работают очень хорошо.

 using (var context = new PrincipalContext( ContextType.Domain )) 
 {
      using (var user = UserPrincipal.FindByIdentity( context, "username" ))
      {
          var groups = user.GetAuthorizationGroups();
          ...
      }
 }

Ответ 2

Используйте System.DirectoryServices пространство имен для доступа к AD.

Два наиболее важных класса:

Предположим, что ваш домен: MyIntranet.MyCompany.com

Затем вам нужно будет создать корневой экземпляр класса DirectoryEntry:

DirectoryEntry root = new DirectoryEntry("LDAP://DC=MyIntranet,DC=MyCompany,DC=com");

При поиске в AD для конкретного события группы или пользователя:

DirectorySearcher searcher = new DirectorySearcher();
searcher.SearchRoot = root;
searcher.SearchScope = SearchScope.Subtree;

Предположим, вы хотите найти имя пользователя с именем: AnyUser1, DirectorySearcher.Filter должно выглядеть так:

searcher.Filter = string.Format("(&(objectCategory=person)(objectClass=user)(sAMAccountName={0})", "AnyUser1");

Затем получим результат через класс SearchResult следующим образом:

bool userFound = false;
SearchResult foundUser = null;

try {
    foundUser = searcher.FindOne(); // You might as well use the FindAll() method if you expect more then one result.
    userFound = foundUser != null;
} catch(Exception) {
    throw;
}

if (!userFound)
    return;

DirectoryEntry user = foundUser.GetDirectoryEntry();

Затем вы можете получить группы, к которым этот пользователь входит, например, через свойство memberOf:

user.Properties("memberOf").Value

Для получения хорошего обзора см. эту статью CodeProject: Как (почти) все в Active Directory.

И из списка свойств: Сопоставление между свойствами IADsUser и атрибутами Active Directory.

РЕДАКТИРОВАТЬ № 1

Если вы используете олицетворение, возможно, вам стоит попробовать установить некоторые параметры для вашего приложения, такие как DefaultRootDomain, DefaultUserName и DefaultPassword, а затем использовать их при создании корня DirectoroEntry.

public static class AdHelper {

    public static string DefaultRootDse {
        get {
            return Properties.Settings.Default.DefaultRootDomain;
        }
    }

    private static string DefaultUserName {
        get {
            return Properties.Settings.Default.DefaultUserName;
        }
    }

    private static string DefaultPassword {
        get {
            return Properties.Settings.Default.DefaultPassword;
        }
    } 

    public static DirectoryEntry RootDse {
        get {
            if (_rootDse == null)
                _rootDse = new DirectoryEntry(DefaultRootDse, DefaultUserName, DefaultPassword);
            return _rootDse;
        }
    }
    private static DirectoryEntry _rootDse;
}

Ответ 3

Если у вас есть .NET 3.5 или вы можете его обновить - всеми средствами используйте новую функцию в System.DirectoryServices.AccountManagement!

Для получения дополнительной информации и быстрого запуска см. замечательную статью Управление принципами безопасности каталога в .NET Framework 3.5" в журнале MSDN.