.net - 从 NT 域名推断 LDAP 地址

标签 .net active-directory ldap

给定一个 NT 样式的帐户名称 (DOMAIN\UserName) 是否可以推断出该域的 LDAP 地址是什么,以便可以查找用户信息?

我的场景:
我有一个在 IIS 上运行的 asp.net 应用程序,它接受匿名用户和域用户。匿名用户必须登录,但域用户我检查服务器 header 以获取 IIS 提供的域用户名。我需要从事件目录中查找一些信息,例如电子邮件地址等。如果我在 config 中提供 LDAP 地址,我就可以完成这项工作,但如果可以避免的话,我宁愿不必维护这个额外的配置值。

最佳答案

如果所有域都属于同一个林,您应该能够执行全局编录搜索(GC://而不是 LDAP://)。您只能获得部分属性集,但您可以获取 DistinguishedName,然后进行标准 LDAP://查找。

如果您的不同域位于不同的森林中,那么一种简单的方法是构建您的 NetBIOS 域名的查找表。对于每个林,您使用 (netBIOSname=*) 过滤器对 CN=Partitions,CN=Configuration,DC=YourDomain,DC=com 进行子树搜索,您将获得该林中域的列表。 dnsRoot 属性将为您提供域的 DNS 名称,您可以使用它来绑定(bind),或者对其进行 DNS 查找并使用您绑定(bind)的第一个地址。或者您可以使用 dnsRoot 创建 System.DirectoryServices.ActiveDirectory.DirectoryContext 以使用 DirectoryServer 的 DirectoryContextType 来获取对域 Controller 的引用。或者您可以使用 nCName (为您提供域的命名上下文)。

如果您可以提供更多详细信息,或者其中任何一个不清楚,我可能会提供更多帮助。

补充:

  • 您可以通过提供目录中对象的 distinctName 来执行“无服务器绑定(bind)”来获取 DirectoryEntry。例如。 “LDAP://CN=User1,CN=Users,DC=yourdomain,DC=com”。这将自动发现适当的域 Controller 并绑定(bind)到它以获取对象。
  • 如果您使用 DirectorySearcher 进行搜索,并且您不提供 SearchRoot 对象,它将自动绑定(bind)到当前域的根目录。您可以提供 SearchRoot 来缩小搜索范围,但您不必这样做。
  • 如果您绝对需要获取当前域的名称,您可以绑定(bind)到一个名为 RootDSE ("LDAP://RootDSE") 的对象并获取 defaultNamingContext 属性的值。这将返回“DC=yourdomain,DC=com”位。

  • 坦率地说,除非您确定需要它,否则更通用的代码可能不值得痛苦,因为它将取决于您的域和森林的结构。例如。如果您有两个森林,它们之间是否存在信任:在您有两个森林之前您不会知道这一点,并且解决方案将取决于此。敏捷开发中有一句精辟的小格言让我无法理解,但它遵循不要编写你现在不需要的代码。

    这是一个将执行此类搜索的控制台程序:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.DirectoryServices;
    
    namespace SearchDirectory
    {
        class Program
        {
            static void Main(string[] args)
            {
                string user = @"YOURDOMAIN\yourid";
    
                using (DirectorySearcher ds = new DirectorySearcher())
                {
                    ds.SearchScope = SearchScope.Subtree;
                    ds.Filter = String.Format("(&(objectClass=user)(objectCategory=person)(sAMAccountName={0}))",
                        user.Split('\\')[1]);
                    ds.PageSize = 1000;
                    using (SearchResultCollection src = ds.FindAll())
                    {
                        foreach (SearchResult sr in src)
                            Console.WriteLine(sr.Properties["distinguishedName"][0].ToString());
                    }
                }
    
                Console.WriteLine("\r\nPress a key to continue...");
                Console.ReadKey(true);
            }
        }
    }
    

    我已经在这方面走了一些弯路,但它应该让你开始。我的建议是让它在控制台程序中运行,然后将该类移动到您的 ASP.NET 项目中。 System.DirectoryServices 可能会抛出许多奇怪的错误,并且在 ASP.NET 中使用 S.DS 也很有趣,因此最好在将代码包装到所有 ASP.NET 的可爱之处之前了解它的工作原理。

    关于.net - 从 NT 域名推断 LDAP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1263906/

    相关文章:

    active-directory - 有没有使用 Nestjs 的 Active Directory 身份验证的好方法?

    svn - 使用 LDAP 进行 SVN 用户认证

    java - LDAP 过滤器中的近似相等性是什么?

    c# - 实现提供者模式?

    .net - ImageList 透明度错误的解决方法?

    linux - Active Directory 和 linux nslcd 绑定(bind)而不扩展 AD 模式

    c# - 从 ad lds 实例验证 asp.net mvc 5 应用程序

    .net - WPF 是 Windows 应用程序的选择吗?

    .net - 动态添加的 Web.UI.ITemplate 类的最佳实践

    php - 退出 Windows 身份验证