使用PrincipalContext& PrincipalSearcher从单独的服务器访问Active Directory用户

时间:2013-12-06 16:53:52

标签: c# asp.net-mvc active-directory iprincipal

我有以下代码来检索当前的活动目录用户:

public List<DomainContext> GetADUsers(string term=null)
{
    List<DomainContext> results = new List<DomainContext>();
    string ADServerName = System.Web.Configuration.WebConfigurationManager.AppSettings["ADServerName"];

    using (var context = new PrincipalContext(ContextType.Domain, ADServerName))
    using (var searcher = new PrincipalSearcher(new UserPrincipal(context)))
    {
        var searchResults = searcher.FindAll();

        foreach (Principal p in searchResults)
        {
            if (term == null || p.SamAccountName.ToString().ToUpper().StartsWith(term.ToUpper()))
            {
                DomainContext dc = new DomainContext();
                dc.DisplayName = p.DisplayName;
                dc.UserPrincipalName = p.UserPrincipalName;
                dc.Name = p.Name;
                dc.SamAccountName = p.SamAccountName;

                results.Add(dc);
            }
        }
    }

    return results;
}

我目前的情况如下:

  1. 我正在开发机器上,ASP.NET MVC Web应用程序和Active Directory都在同一台机器上。

  2. 我没有传递用户名和密码来获取AD用户。

  3. 当我将包含上述代码的ASP.NET MVC Web应用程序移动到我的UAT服务器时,我有以下问题:

    1. 在UAT服务器上,ASP.NET MVC Web应用程序和AD将位于两台不同的计算机上。
    2. 要从某台计算机访问AD,我可能需要向AD服务器发送用户名和密码。
    3. 如果符合以下条件,原始代码也会有效:

      1. AD和ASP.NET MVC Web应用程序位于不同的计算机上?
      2. 如果AD服务器需要传递用户名和密码?

1 个答案:

答案 0 :(得分:2)

有两种可能性。

您可以将用户名/密码传递给PricipalContext,或者应用程序池的标识有足够的权限来查询AD,然后您不必提供用户名/密码。

如果应用程序服务器位于AD中,后者非常方便,因为代码和/或配置文件中没有用户名/密码。另一方面,如果应用程序服务器在AD中,则以明确的方式传递用户名/密码是唯一可行的方法。