Запрос из LDAP для групп пользователей - PullRequest
9 голосов
/ 10 марта 2011

Как получить группу пользователей пользователя из активного каталога LDAP в C # .NET для ASP.В моем сценарии я хочу передать имя пользователя методу, который запрашивает из Active Directory LDAP, и сказать, что мой пользователь является членом этой группы пользователей.Пожалуйста, помогите мне в этом

Ответы [ 6 ]

12 голосов
/ 10 марта 2011

Если вы используете .NET 3.5 или новее, вы также можете использовать новые пространства имен System.DirectoryServices.AccountManagement (S.DS.AM).

С этим вы можете сделать что-то вроде:

// create context for domain
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

// find the user
UserPrincipal up = UserPrincipal.FindByIdentity(ctx, "YourUserName");

if(up != null)
{
    // get groups for that user
    var authGroups = up.GetAuthorizationGroups();
}

Подробнее о новом пространстве имен S.DS.AM:

Управление принципами безопасности каталогов в.NET Framework 3.5

4 голосов
/ 10 марта 2011

Изучите использование пространства имен System.DirectoryServices .Вы можете использовать DirectorySearcher , чтобы найти пользователя.Как только у вас есть объект DirectoryEntry для этого пользователя, сделайте следующее:

public List<string> GetMemberOf(DirectoryEntry de)
{
  List<string> memberof = new List<string>();

  foreach (object oMember in de.Properties["memberOf"])
  {
    memberof.Add(oMember.ToString());
  }

  return memberof;
}

Это вернет список строк, которые являются именами групп, в которые входит пользователь.1011 * Конечно, вы можете дополнительно уточнить это, включив код DirectorySearcher, чтобы вы могли просто передать функцию samAccountName.

3 голосов
/ 12 августа 2011

попробуйте это ...

public override string[] GetRolesForUser(string username)
    {
    var allRoles = new List<string>();
    var root = new DirectoryEntry(WebConfigurationManager.ConnectionStrings[ConnectionStringName].ConnectionString,
                                    ConnectionUsername,
                                    ConnectionPassword);

    var searcher = new DirectorySearcher(root,
                                        string.Format(CultureInfo.InvariantCulture, "(&(objectClass=user)({0}={1}))",
                                                                                    AttributeMapUsername,
                                                                                    username));

    searcher.PropertiesToLoad.Add("memberOf");
    SearchResult result = searcher.FindOne();
    if (result != null && !string.IsNullOrEmpty(result.Path))
    {
        DirectoryEntry user = result.GetDirectoryEntry();
        PropertyValueCollection groups = user.Properties["memberOf"];
        foreach (string path in groups)
        {
            string[] parts = path.Split(',');
            if (parts.Length > 0)
            {
                foreach (string part in parts)
                {
                    string[] p = part.Split('=');
                    if (p[0].Equals("cn", StringComparison.OrdinalIgnoreCase))
                    {
                        allRoles.Add(p[1]);
                    }
                }
            }
        }
    }
    return allRoles.ToArray();
}
2 голосов
/ 29 мая 2015

Мне нужен метод аутентификации пользователя и проверка, находятся ли они в определенной группе пользователей.Я сделал это, нажав имя пользователя и пароль и загрузив свойство memberOf в экземпляр search.Пример ниже покажет все группы для этого конкретного имени пользователя.Оператор 'catch' будет перехватывать неверное имя пользователя или пароль.

DirectoryEntry entry = new DirectoryEntry("LDAP://xxxxxxxx/OU=xxxxxxx,DC=xxxxxx,DC=xxxxx,DC=xxxxxx", strLdapUserName, strLdapPassword);

    try
    {
    //the object is needed to fire off the ldap connection
    object obj = entry.NativeObject;

    DirectorySearcher search = new DirectorySearcher(entry);
    search.Filter = "(SAMAccountName=" + strLdapUserName + ")";
    search.PropertiesToLoad.Add("memberOf");
    SearchResult result = search.FindOne();
    string filterAttribute = (String)result.Properties["cn"][0];

    foreach(string groupMemberShipName in result.Properties["memberOf"])
    {
        Console.WriteLine("Member of - {0}", groupMemberShipName);
    }

    }
    catch (Exception ex)
    {
    //failed to authenticate
    throw new Exception(ex.ToString());
    }

Надеюсь, это поможет.(Не забудьте сослаться на System.DirectoryServices)

2 голосов
/ 10 марта 2011

Используйте класс DirectorySearcher для предварительного запроса ldap.

Для справки:

http://www.codeproject.com/KB/system/QueryADwithDotNet.aspx

0 голосов
/ 30 января 2013

Я думаю, что большинство методов, перечисленных выше, должны работать, но я бы предложил добавить код, чтобы гарантировать, что ваш код может "обнаруживать циклические циклы в членстве во вложенных группах", и, если он найден, прерывать любые бесконечные циклы, которые потенциально может получить ваш выбранный скриптв.

...