PrincipicalContext ActiveDirectory проверка пользователя в контейнере

#c# #validation #ldap

#c# #проверка #ldap

Вопрос:

 using (PrincipalContext pc = new PrincipalContext(ContextType.Domain,"domain","CN=GroupName, DC = domainc, DC = local")) 
{
    // validate the credentials
    try
    {
        bool isValid = pc.ValidateCredentials("userName", "password");
    }
    catch (Exception e)
    {

    }
}
  

В конструкторе PrincipialContext, если я только введу имя домена, я смогу проверить пользователя. Однако, если я введу CN=»BadGroupNameDoesNotExist», он все равно проверяет пользователя как true. Кажется, не имеет значения, что я ввел для CN.

Почему это? Я новичок в Active Directory и подумал, что ввод действительного CN будет иметь действительные учетные данные, только если он принадлежит к этой группе, но это кажется неверным?

Комментарии:

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

Ответ №1:

вы могли бы попробовать создать класс utils и добавить следующие методы и т.д..

 using System.Security;
using System.DirectoryServices.AccountManagement;
public struct Credentials
{
    public string Username;
    public string Password;
}
public class Domain_Authentication
{
    public Credentials Credentials;
    public string Domain;
    public Domain_Authentication(string Username, string Password, string SDomain)
    {
        Credentials.Username = Username;
        Credentials.Password = Password;
        Domain = SDomain;
    }
    public bool IsValid()
    {
        using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, Domain))
        {
            // validate the credentials
            return pc.ValidateCredentials(Credentials.Username, Credentials.Password);
        }
    }
}
  

Комментарии:

1. Как бы я вернул true, если бы только пользователь принадлежал к определенной группе?

2. вы могли бы использовать GroupPrincipal внутри using, например GroupPrincipal group = GroupPrincipal.FindByIdentity(principalContext, "YourGroupName"); , тогда вы можете выполнять поиск по группе. Свойство Members до тех пор, пока у вас не будет нужного участника.

3. пример foreach (Principal prnc in group.Members)

Ответ №2:

Вы правы в том, что ValidateCredentials не обращаете внимания на имя контейнера / подразделения.

Оба раздела примечаний в документации включают

Метод ValidateCredentials привязывается к серверу, указанному в конструкторе.

Нет упоминания о контейнере, указанном в используемом конструкторе, и, как вы обнаружили, он также не проверяется.