Я должен получить доступ к Active Directory для получения информации о группах, которым принадлежат клиенты. Проект, который я имею, является приложением MVC ASP.NET с помощью C#. Я никогда не программировал против Active Directory прежде и нуждаюсь в некотором совете относительно того, какой лучший способ начать, какая модель обеспечения безопасности использовать для доступа к информации, и возможно указывают на меня на некоторые хорошие учебные руководства.
Поскольку вы используете 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();
...
}
}
Используйте пространство имен 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;
}
Если у вас .NET 3.5 или вы можете обновить его до него - обязательно используйте новую функцию в System.DirectoryServices.AccountManagement
!
См. Отличную вводную статью Управление принципами безопасности каталогов в .NET Framework 3.5 в журнале MSDN Magazine для получения дополнительной информации и быстрого старта.