Доступ к Active Directory из ASP.Net MVC с использованием C # - PullRequest
24 голосов
/ 02 июня 2010

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

Ответы [ 4 ]

47 голосов
/ 02 июня 2010

Поскольку вы используете 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();
          ...
      }
 }
13 голосов
/ 02 июня 2010

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

Два самых важных класса:

  1. DirectoryEntry ;
  2. DirectorySearcher .

Предположим, что ваш домен: 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;
}
0 голосов
/ 07 июля 2012

почему не 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)

0 голосов
/ 02 июня 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...