С# проверить, является ли пользователь членом группы?

У меня есть код, который я использую, чтобы проверить, является ли пользователь членом AD, работает отлично,

теперь я хочу добавить возможность проверить, является ли пользователь членом группы!

что мне нужно изменить, чтобы добиться этого, я немного поработал, но это не удается!

так вот мой код:

        //Authenticate a User Against the Directory
        private bool Authenticate(string userName,string password, string domain)
        {

            if (userName == "" || password == "")
            {
                return false;
            }

            bool authentic = false;
            try
            {
                DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain,userName, password);
                object nativeObject = entry.NativeObject;
                authentic = true;
            }
            catch (DirectoryServicesCOMException) { }
            return authentic;
        }

Я хочу сделать это так:

private bool Authenticate(string userName,string password, string domain, string group)

person Data-Base    schedule 06.12.2010    source источник
comment
Возможно, вы используете неправильный API для этой задачи. Вы пишете код аутентификации для приложения? Если это так, должен быть гораздо более простой API. Например, в ASP.NET вы можете получить доступ к этой информации с помощью объекта Page.User. Или целью приложения является запрос Active Directory?   -  person David    schedule 06.12.2010


Ответы (3)


Это недоступно в Windows XP или более ранних версиях.

В любом случае, чтобы проверить членство в группе, вы можете использовать этот код:

bool IsInGroup(string user, string group)
{
    using (var identity = new WindowsIdentity(user))
    {
        var principal = new WindowsPrincipal(identity);
        return principal.IsInRole(group);
    }
}
person Ran    schedule 06.12.2010
comment
Я использовал этот код с разными пользователями и паролями с машины, которая не является членом DC! и это работает! - person Data-Base; 06.12.2010
comment
Спасибо, но как интегрировать это в мой код? пользователь строки сбивает меня с толку! также есть какой-то документ, на который я могу взглянуть? - person Data-Base; 06.12.2010
comment
Это имя пользователя в домене. Вероятно, он будет работать только с именем пользователя, если машина находится в том же домене, или может работать с user@domain или domain\user. - person Ran; 06.12.2010
comment
Для меня это сработало как шарм, и мне вообще не нужно было аутентифицировать запрошенного пользователя. - person Raffaeu; 21.12.2011
comment
В чем проблема с Windows XP? Будет ли new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(group) работать в Windows XP? - person Heinzi; 12.11.2013
comment
Этот подход требует аутентификации на моем локальном компьютере с Windows 8.1. Так что, кажется, это работает только в доменных средах, что глупо для MS! - person Meghdad; 12.03.2021

В ASP.Net вы будете использовать Page.User.IsInRole("RoleName") или в Windows вы можете использовать System.Threading.Thread.CurrentPrincipal.IsInRole("RoleName")

person jvanrhyn    schedule 06.12.2010
comment
RoleName - это имя группы? - person Data-Base; 06.12.2010
comment
Да, пользователь может принадлежать к разным Ролям (группам). - person jvanrhyn; 06.12.2010

Я решаю это с помощью этого кода

public bool AuthenticateGroup(string userName, string password, string domain, string group)
    {


        if (userName == "" || password == "")
        {
            return false;
        }

        try
        {
            DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain, userName, password);
            DirectorySearcher mySearcher = new DirectorySearcher(entry);
            mySearcher.Filter = "(&(objectClass=user)(|(cn=" + userName + ")(sAMAccountName=" + userName + ")))";
            SearchResult result = mySearcher.FindOne();

            foreach (string GroupPath in result.Properties["memberOf"])
            {
                if (GroupPath.Contains(group))
                {
                    return true;
                }
            }
        }
        catch (DirectoryServicesCOMException)
        {
        }
        return false;
    }

он отлично работает для меня, и его можно использовать с машиной, не являющейся частью контроллера домена / Active Directory.

Спасибо всем за помощь

person Data-Base    schedule 05.01.2011