从客户端获取AD用户和组

时间:2019-11-15 17:54:18

标签: c# .net angular active-directory

是否可以通过任何方法访问客户端AD用户和组,并使其外网访问Intranet设置?

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

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

在我自己的域上检索广告信息是可以实现的,我可以获得UserPrincipals, 但是如果Web API和AD不在同一服务器上托管,那怎么办?

2 个答案:

答案 0 :(得分:1)

由于我尚未使用.NET Core进行操作,因此我无法确切地告诉您该怎么做,但是我可以告诉您您需要做什么,并且可以查找有关每个部分的更多详细信息。 / p>

  1. 使用表单身份验证。您将需要一个登录页面,询问他们的用户名和密码。
  2. 验证凭据。有几种方法可以做到这一点。我最喜欢的是this answer,它使用System.DirectoryServices.Protocols中的LdapConnection,因为它是完成工作所需的最少网络请求,并且会告诉您为什么凭据失败(例如,如果用户的密码已过期,它将使您进入“更改密码”页面)。但是,使用DirectoryEntry / DirectorySearcher可以更容易地查找组,因此,您可能还希望通过在DirectoryEntry的构造函数中使用用户的凭据来将其用于验证。会不知道失败尝试的原因)。
  3. 查找用户的帐户。我更喜欢使用System.DirectoryServices中的DirectoryEntry / DirectorySearcher。 Eldar的答案显示了如何做到这一点。
  4. 查找用户的组。我写了整篇文章:Finding all of a user's groups。假设您的环境中只有一个域,并且您已经有一个用于用户帐户的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;
}

如果您的环境中有多个域,那么它将变得更加复杂。

答案 1 :(得分:0)

       var entry = new DirectoryEntry("LDAP://DC=DomainController,DC=com","UserName","P4$$w0Rd!???"); 
       // userName password must be valid

        var searcher = new DirectorySearcher(entry);
        searcher.PropertiesToLoad.Add("sn");
        var accName = "accNameToSearch"; // you can also use wildcart 
        // https://docs.microsoft.com/en-us/windows/win32/adsi/search-filter-syntax
        searcher.Filter = $"(&(objectCategory=person)(objectClass=user)(sAMAccountName={accName}))"; 
        var result = searcher.FindOne();
        var sn = result.Properties["sn"];

该nuget包尚无UserPrincipal类。但是您仍然可以使用上述广告查询语法来查询用户和其他内容。