首页 > 解决方案 > 从客户端获取 AD 用户和组

问题描述

有没有办法在 Intranet 设置之外访问客户端 AD 用户和组?

不是在寻找天蓝色的解决方案。

我正在使用的技术是 .Net Core web api 和 Angular 作为前端。

在我自己的域上检索 AD 信息是可以实现的,并且我可以获得 UserPrincipals,但如果 Web API 和 AD 没有托管在同一台服务器上,那它是如何工作的?

标签: c#.netangularactive-directory

解决方案


我不能确切地告诉你怎么做,因为我还没有用 .NET Core 做过,但我可以告诉你你需要做什么,你可以查找有关每个部分的更多详细信息。

  1. 使用表单身份验证。您将需要一个登录页面,询问他们的用户名和密码。
  2. 验证凭据。有几种方法可以做到这一点。我最喜欢的是这个答案,它使用LdapConnectionfromSystem.DirectoryServices.Protocols因为它是完成这项工作所需的最少网络请求,它会告诉您凭据失败的原因(如果他们的密码有,这将让您将用户带到“更改密码”页面例如过期)。但是,使用DirectoryEntry/DirectorySearcher更容易查找组,因此您可能还希望通过在构造函数中使用用户凭据来进行验证DirectoryEntry(但您会不知道尝试失败的原因)。
  3. 查找用户的帐户。我更喜欢为此使用DirectoryEntry/ DirectorySearcherfrom System.DirectoryServices。Eldar 的回答显示了如何做到这一点。
  4. 查找用户的组。我为此写了整篇文章:查找所有用户组。假设您的环境中只有一个域,并且您已经有一个DirectoryEntry用户帐户的对象,则此代码将起作用:
private static IEnumerable<string> GetUserMemberOf(DirectoryEntry de) {
    var groups = new List<string>();

    //retrieve only the memberOf attribute from the user
    de.RefreshCache(new[] {"memberOf"});

    while (true) {
        var memberOf = de.Properties["memberOf"];
        foreach (string group in memberOf) {
            var groupDe = new DirectoryEntry($"LDAP://{group.Replace("/", "\\/")}");
            groupDe.RefreshCache(new[] {"cn"});
            groups.Add(groupDe.Properties["cn"].Value as string);
        }

        //AD only gives us 1000 or 1500 at a time (depending on the server version)
        //so if we've hit that, go see if there are more
        if (memberOf.Count != 1500 && memberOf.Count != 1000) break;

        try {
            de.RefreshCache(new[] {$"memberOf;range={groups.Count}-*"});
        } catch (COMException e) {
            if (e.ErrorCode == unchecked((int) 0x80072020)) break; //no more results

            throw;
        }
    }
    return groups;
}

如果您的环境中有多个域,那么它会有点复杂。


推荐阅读