0

我需要检查我的应用程序中的用户是否是活动目录中的活动用户。当其中一个用户别名无效时,我需要发送通知。

在大多数示例中,我看到使用 LDAP 一次仅针对 ADFS 验证一个用户,这将花费大量用户很长时间。

有什么方法可以通过发送用户列表和验证来进行验证,这样它会更快?

谢谢。

4

2 回答 2

0

在 ADFS 中开箱即用,没有。

这听起来像是你应该从你的应用程序中调用的东西。使用 AD C# API。

请参阅Howto:(几乎)通过 C# 在 Active Directory 中的所有内容

或者(在某些情况下)通过 C#.NET 3.5 在 Active Directory 中的所有内容(使用 System.DirectoryServices.AccountManagement)

于 2013-06-20T07:27:23.450 回答
0

从 .Net 3.5 开始,有 System.DirectoryServices.AccountManagement

我会编写类似的代码

public List<string> InvalidUsernames (List<string> usernames)
{
    var result = new List<string>();
    var domainName = "OkieDokie";
    var ldapContext = new PrincipalContext(ContextType.Domain, domainName);
    foreach (var username in usernames)
    {
        var user = UserPrincipal.FindByIdentity(ldapContext, username);
        if (user == null) //null means it couldn't be found
        {
            result.Add(username);
        }
    }
    return result;
}

但这一切都取决于您认为有效/无效的内容。如果您可以检查 user.AccountExpirationDate (?date) 或 user.Enabled (?bool)。

或者,如果您确实有一个共同的组,您可以替换以前的 foreach 并使用:

var usersGroup = UsernamesInGroup("theONEgroup");
foreach (var username in usernames)
{
    var user = UserPrincipal.FindByIdentity(ldapContext, username);
    if (user == null) //null means it couldn't be found
    {
        result.Add(username);
    }
}

public List<string> UsernamesInGroup(string groupName)
{
    GroupPrincipal grupo = GroupPrincipal.FindByIdentity(MainOU, groupName);
    return UsernamesInGroup(group);
}

public List<string> UsernamesInGroup(GroupPrincipal gp)
{
    List<string> userNames = new List<string>();
    var principalsInGroup = gp.GetMembers(true);
    foreach (Principal principal in principalsInGroup)
    {
        if (principal.StructuralObjectClass == "user")
        {
            userNames.Add(principal.SamAccountName);
        }
    }
    return userNames;
}
于 2013-06-20T21:46:15.210 回答