Я использую LdapAuthentication для входа пользователя в Active Directory. Я хочу найти все группы, к которым принадлежит пользователь. Я использую следующий код:
string adPath = "LDAP://OU=HR Controlled Users,OU=All Users,DC=myDomain,DC=local";
LdapAuthentication adAuth = new LdapAuthentication(adPath);
try
{
if (true == adAuth.IsAuthenticated("myDomain", txtLoginEmail.Text, txtLoginPassword.Text))
{
string email = txtLoginEmail.Text;
using (PrincipalContext context = new PrincipalContext(ContextType.Domain))
{
UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.Name, email);
foreach (var group in user.GetGroups())
{
Console.WriteLine(group.Name);
}
}
}
}
catch(Exception e) { /* Handle Error */ }
Моя проблема в том, что когда я вызываю UserPrincipal.FindByIdentity(), я всегда получаю нулевое значение, даже если аутентификация пользователя работает как положено.
Почему это происходит? Есть проблема с кодом или с моим подходом? Это выполняется внутри приложения ASP.NET 4.0 WebForms.
Обновление:
По-видимому, я использовал неправильный IdentityType (cn). Я проверил отладку, и имя учетной записи «UserA».
Поэтому я попытался использовать следующий код вручную:
UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.Name, "UserA");
Но все же я получаю ноль.
Обновление 2 (решено):
Проблема была двоякой. Мне нужно было указать имя моего контроллера домена при объявлении файла PrincipalContext
.
using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "myDomain"))
{
// code here...
}
Затем при поиске UserPrincipal
я использовал неправильный IdentityType
; Я искал с IdentityType.Name
— это имя учетной записи — вместо IdentityType.SamAccountName
— это имя пользователя.
UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, email);
Проблема решена.