Active Directory:检索用户信息

时间:2020-03-06 14:42:39  来源:igfitidea点击:

我有一个使用我们的Active Directory针对Windows身份验证运行的Web应用程序。我有一个新要求,要从Active Directory条目中提取一些个人信息。访问此信息的最简单方法是什么?

解决方案

我已经使用标准的LDAP库从Active Directory服务器中检索信息,但是我们必须验证所需的数据是否可以通过LDAP服务器的架构获得。通常,我们可以获得存储在InetOrganizationalPerson中的任何信息,以及与它们所属的组有关的大多数信息。

看一下System.DirectoryServices命名空间:

System.DirectoryServices命名空间

通过DirectoryEntry直接访问用户似乎是最直接的方法。这是我从第一个与AD有关的项目中学到的与AD有关的花絮:

  • 在URI中,以小写形式编写LDAP。否则,我们将得到一个神秘的错误。在这个令人沮丧的问题上,我花了一天多的时间...
  • 要清除单值属性,请将其设置为空字符串,而不是null。 Null会导致异常。
  • 若要清除多值属性,请使用DirectoryEntry.Property.Clear()方法。
  • Active Directory架构引用将说明值将是哪种数据类型,以及它是多值还是单值。
  • 我们不需要在Directoryentry上手动刷新RefreshCache(),但是如果我们曾经使用过它并指定要缓存的属性,请知道它将来不会自动检索任何其他属性。
  • 绝对可以在任何时候使用System.DirectoryServices中的类引发COMException。留意那些尝试块。不要以为是安全的。

如果我们不知道用户的目录路径,则可能需要使用DirectorySearcher来获取它的路径(我们只需通过登录即可知道该路径)。使用它相当容易,但是要注意LDAP语法中的怪癖。也就是说,必须编码非ASCII(和其他?)字符。我们将使用的搜索字符串可能类似于:(&(sAMAccountName = whatever)(class = user))。这不在我的脑海中,可能有点不正确。

Active Directory架构参考将很有用。请务必了解可以修改和扩展该架构(例如,安装Exchange将向用户添加邮箱信息)。

AD Explorer是有用的工具,可用于调试和低级AD数据管理。当我知道要设置哪个属性但在AD管理工具中找不到正确的对话框时,我发现它很有用。

我们可能会发现以下代码片段对于初学者很有用。

public static bool IsUserInGroup(string lanid, string group)
{
    DirectoryEntry entry = new DirectoryEntry("LDAP://" + LDAPPATH);
    if(entry != null)
    {
        entry.Username=@"LDAPUSER";
        entry.Password="LDAPPASSWORD";
        DirectorySearcher srch = new DirectorySearcher(entry);
        srch.Filter = String.Format("(&(objectClass=person)(sAMAccountName={0}))", lanid);
        srch.PropertiesToLoad.Add("memberOf");

        SearchResult result = srch.FindOne();
        if(result != null)
        {
            if(result.Properties.Contains("memberOf"))
            {
                string lookfor = String.Format("cn={0},", group.ToLower());
                foreach(string memberOf in result.Properties["memberOf"])
                {
                    if(memberOf.ToLower().StartsWith(lookfor))
                        return true;
                }
            }
        }
        return false;
    }
    throw new Exception(String.Format("Could not get Directory lanid:{0}, group{1}",   lanid, group));
}

一个很好的参考:操作方法:(几乎)通过C#在Active Directory中进行所有操作