【问题标题】:Check if List of Users are valid against adfs in C#检查用户列表是否对 C# 中的 adfs 有效
【发布时间】:2013-06-20 05:22:54
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

  • 什么意思,“活跃”无效呢?他们不是在特定的组吗?

标签: active-directory ldap directoryservices adfs


【解决方案1】:

在 ADFS 中开箱即用,没有。

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

请参考Howto: (Almost) Everything In Active Directory via C#

或者(在某些情况下)Everything in Active Directory via C#.NET 3.5 (Using System.DirectoryServices.AccountManagement)

【讨论】:

  • 这已经过时了。有一种更简单的方法。
  • 哪个是?你是说账户管理吗?这只是一个子集。所以不,在某些情况下,它并没有过时。
  • 是的,AccountManagement。我认为这个子集就足够了,而且它会更容易编码。
【解决方案2】:

从 .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;
}

【讨论】:

    猜你喜欢
    • 2021-11-04
    • 2018-10-06
    • 2014-08-08
    • 2022-11-25
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多