我正在使用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”。

c# - UserPrincipal.FindByIdentity()始终返回null-LMLPHP

因此,我尝试手动使用以下代码:
UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.Name, "UserA");

但是我还是一无所有。

更新2(已解决):

这个问题有两个方面。声明PrincipalContext时,我需要指定域 Controller 的名称。
using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "myDomain"))
{
   // code here...
}

然后,当搜索UserPrincipal时,我使用了错误的IdentityType;我正在使用IdentityType.Name(即帐户名称)而不是IdentityType.SamAccountName(即用户名)进行搜索。
UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, email);

问题已解决。

最佳答案

通过使用IdentityType.Name,您可以告诉它所传递的值是帐户名称(即cn属性)。如果要按用户名(sAMAccountName atrribute)进行匹配,则需要传递IdentityType.SamAccountName

旧答案:
但是您似乎正在向其发送电子邮件地址。因此,这的确将一无所获。

AD不会将电子邮件地址视为唯一标识符,因此您不能将FindByIdentity与电子邮件地址一起使用。

这是有关如何通过电子邮件地址进行搜索的示例:http://doogalbellend.blogspot.ca/2012/03/finding-userprincipal-for-email-address.html

10-06 14:17