Проверьте, действителен ли список пользователей для adfs в С#

У меня есть требование проверить, являются ли пользователи в моем приложении активными пользователями в активном каталоге. Мне нужно отправить уведомление, когда один из псевдонимов пользователей становится недействительным.

В большинстве примеров я вижу проверку только одного пользователя одновременно с ADFS с использованием LDAP, что займет очень много времени для большого количества пользователей.

Есть ли способ проверить, отправив список пользователей и проверить, чтобы это было быстрее?

Спасибо.


person user2328252    schedule 20.06.2013    source источник
comment
Что вы имеете в виду под активным? А недействительным? Они не в какой-то конкретной группе?   -  person Luiz Angelo    schedule 21.06.2013


Ответы (2)


Из коробки в ADFS нет.

Это похоже на то, что вы должны вызывать из своего приложения. с помощью AD C# API.

См. Как: (почти) все в Active Каталог через C#.

Или (в некоторых случаях) Все в Active Directory через C#.NET 3.5 (с использованием System.DirectoryServices.AccountManagement)

person rbrayb    schedule 20.06.2013
comment
Это устарело. Есть более простой способ. - person Luiz Angelo; 21.06.2013
comment
Который? Вы имеете в виду учетную запись? Это только подмножество. Так что нет, для некоторых сценариев он не устарел. - person rbrayb; 21.06.2013
comment
Да, управление учетными записями. Я думаю, что подмножества будет достаточно, и его будет намного проще кодировать. - person Luiz Angelo; 21.06.2013

Начиная с .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;
}
person Luiz Angelo    schedule 20.06.2013