Winform авторизация пользователя через активный каталог - PullRequest
7 голосов
/ 13 января 2011

У меня есть ситуация, когда я использую следующий код для проверки членства пользователя в AD перед выполнением задач в моем приложении

using System.Security.Principal;
WindowsIdentity  identity = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(identity);
return principal.IsInRole("someGroup");

Приведенный выше код отлично работает для машин в моем домене, однако у меня есть несколько машин, не входящих в мой домен, на которых установлено приложение WINFORM. Как я могу подтвердить членство пользователя в AD?

Редактировать - есть ли способ запросить вход в Windows?

1 Ответ

8 голосов
/ 14 января 2011

Поскольку ваш компьютер вообще не присоединен к домену, мы не можем использовать WindowsIdentity или WindowsPrincipal, а затем проверять его метод IsInRole ().Метод IsInRole () работает только в том случае, если ваш компьютер присоединен к домену и использует учетную запись компьютера домена для выполнения S4USelf.

Вы также не можете использовать подход LogonUser, поскольку ваш компьютер не позволяет создавать сеанс входа в систему.из недоверенного леса.

Я думаю, что мы можем только запросить Active Directory напрямую, чтобы получить необходимую нам информацию.Насколько я могу судить, код в размещенной вами Microsoft KB не очень хорошо работает.Он пытается сделать запрос из атрибута memberOf.Информация о группе не всегда доступна из атрибутов memberOf.

Я только что написал функцию IsInRole (), используя AccountManagement.Я думаю, это то, что вы хотите.Функция IsInRole () вызовет рекурсивную функцию IsInGroup (), чтобы выяснить все группы, к которым принадлежит пользователь.

private bool IsInRole(string domain, string username, string password, string role)
{
    using (var context = new PrincipalContext(ContextType.Domain, domain, username, password))
    {
        GroupPrincipal group = GroupPrincipal.FindByIdentity(context, IdentityType.SamAccountName, role);
        UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, username);
        return IsInGroup(user, group);
    }
}

private bool IsInGroup(Principal principal, GroupPrincipal group )
{
    if (principal.IsMemberOf(group))
        return true;

    foreach (var g in principal.GetGroups())
    {
        if (IsInGroup(g, group))
            return true;
    }

    return false;
}

Чтобы использовать эту функцию IsInRole (), вам необходимо указать имя домена и доменполномочия.Если имя пользователя и пароль введены неверно, вы получите исключение.

Для использования API AccountManagement необходим .NET 3.5 SP1.Также вы можете обратить внимание на это исправление .В AccountManagement API были обнаружены некоторые ошибки при работе в какой-либо среде.Возможно, вам придется применить исправление.

...