10

我正在使用 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);

问题解决了。

4

1 回答 1

10

通过使用IdentityType.Name,您告诉它您传递的值是帐户的名称(即cn属性)。如果你想通过用户名(sAMAccountName属性)匹配,你需要通过IdentityType.SamAccountName.


旧答案:但您似乎正在向它发送电子邮件地址。所以这确实永远不会有任何回报。

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

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

于 2016-05-05T13:11:44.567 回答