c# - 在 Active Directory 中获取用户组

标签 c# asp.net wpf web-services active-directory

我在将我的 ASP.NET Web 服务与 Active Directory 设置集成并使用它来验证用户并检查他们所属的 AD 组以及他们是否有权使用我的自定义应用程序时遇到问题。

我的自定义应用程序有自己的权限,管理员配置允许使用自定义应用程序的 Active Directory 组。

我遇到的问题是,当来自不同受信任 AD 林的用户以完全双向信任尝试登录时,我无法从我的 ASP.NET Web 服务通信的 AD 服务器获取他的组列表和。 ASP.NET Web 服务只能访问 AD 服务器(AD Main),不能访问受信任的 AD Controller (AD Secondary)。

用户是 (AD Secondary) 域的成员,我可以针对 (AD Main) 域对该用户进行身份验证,但是当用户位于(AD 辅助)域中。

我试过这段代码。

StringCollection groupids = new StringCollection();
try
{
    DirectoryLibrary dirLib = new DirectoryLibrary();
    DirectoryEntry directoryEntry = new DirectoryEntry("LDAP://" + domain,username, password);   
    if (directoryEntry != null)
    {
        //Enum the properties so we can see what is in them
        foreach (string propname in directoryEntry.Properties.PropertyNames)
        {
            Debug.WriteLine(propname);
        }

        object obGroups = directoryEntry.Invoke("Groups");
        foreach (object ob in (IEnumerable)obGroups)
        {
        // Create object for each group.
            DirectoryEntry obGpEntry = new DirectoryEntry(ob);
            groupids.Add(obGpEntry.NativeGuid);
        }
    }
}
catch (DirectoryServicesCOMException ex) { throw ex; }

我试图从 DirectoryEntry 对象转移到类似这样的东西。

List<GroupPrincipal> result = new List<GroupPrincipal>();
StringCollection groupids = new StringCollection();

PrincipalContext yourDomain = new PrincipalContext(ContextType.Domain, domain, userName, password);

// find your user
UserPrincipal user = UserPrincipal.FindByIdentity(yourDomain, userName);

// if found - grab its groups
if (user != null)
{
    PrincipalSearchResult<Principal> groups = user.GetGroups();

    // iterate over all groups
    foreach (Principal p in groups)
    {
        // make sure to add only group principals
        if (p is GroupPrincipal)
        {
            groupids.Add(p.DisplayName);
        }
    }

}

但是,我没有获得用户,也无法获得其他域中该用户的组列表。任何帮助将不胜感激。

最佳答案

这似乎是 AD 派生属性 memberOf 的一个很好的用例。使用 DirectoryEntry directoryEntry 对象,您可以枚举用户属于哪些组。

foreach (object group in directoryEntry.Properties["memberOf"])
{
    DirectoryEntry obGpEntry = New DirectoryEntry("LDAP://" + (String)group);
    groupids.Add(obGpEntry.NativeGuid);
}

如果您在 ob 前加上“LDAP://”前缀,您也可能会使用第一个代码段

关于c# - 在 Active Directory 中获取用户组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10081234/

相关文章:

c# - 如何使用 directLine channel 在 Azure 表存储中存储和检索机器人数据?

asp.net - 跟踪IP地址和国家名称(asp.net)?

asp.net - 无法加载共享库 "libgdiplus"- Docker [带有 Aspose API 的 .NET 应用程序]

asp.net - SignalR javascript 回调不起作用

c# - 使用 CollectionViewSource 对 ColumnHeader 进行排序

c# - 最佳实践清理 ViewModelLocator

c# - 用 C# 编写的带有点击移动的 WPF 游戏

c# - 优化多个网页的下载。 C#

c# - .NET 中未显示 Delphi COM 对象

c# - C# 是全英文的吗?