Мне нужно получить доступ к Active Directory, чтобы получить информацию о группах, к которым принадлежат клиенты. Проект, который у меня есть, - это приложение ASP.Net MVC с использованием С#. Я никогда не запрограммировал Active Directory раньше, и вам нужно знать, как лучше всего начать работу, какую модель безопасности использовать для доступа к информации, и, возможно, указать мне на некоторые полезные уроки.
Доступ к Active Directory из ASP.Net MVC с использованием С#
Ответ 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.
Ответ 4
почему не System.Web.Security? Он также присутствовал в версии 2.0.
а именно: http://msdn.microsoft.com/en-us/library/system.web.security.activedirectorymembershipprovider(v=vs.85) и теперь в рамках 4.0: http://msdn.microsoft.com/en-us/library/system.web.security.activedirectorymembershipprovider(v=vs.100)