#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 привязывается к серверу, указанному в конструкторе.
Нет упоминания о контейнере, указанном в используемом конструкторе, и, как вы обнаружили, он также не проверяется.