Автоматический вход в Active Directory - PullRequest
2 голосов
/ 01 февраля 2011

У меня возникли трудности с автоматическим входом пользователей в мое приложение Active Directory для рабочего стола.Возможно, я пытаюсь сделать единый вход, но у меня сложилось впечатление, что он предназначен только для веб-приложений.

Код, который у меня есть, таков:

PrincipalContext theContext = new PrincipalContext(ContextType.Domain);
if (theContext.ValidateCredentials(null, null))
    Console.WriteLine("Credentials have been validated. Tell your friends.");
else
    Console.WriteLine("Invalid credentials");
UserPrincipal user = new UserPrincipal(theContext, "uatu", "Passw0rd", true);
user.Save();

Файл PrincipalContext создаетсябез ошибок, и я проверяю полномочия.Я предполагал, что это подтвердит меня как пользователя, который вошел в систему на компьютере, который находится в домене Active Directory.И я могу найти пользователей и группы.Но как только я вызываю user.Save (), я получаю сообщение об ошибке «Доступ запрещен».На самом ли деле я вхожу в Active Directory как гость?

Если я задаю имя пользователя и пароль в ValidateCredentials, это не поможет.

PrincipalContext theContext = new PrincipalContext(ContextType.Domain);
if (theContext.ValidateCredentials("<username>", "<password", ContextOptions.Negotiate | ContextOptions.Signing | ContextOptions.Sealing))
    Console.WriteLine("Credentials have been validated. Tell your friends.");
else
    Console.WriteLine("Invalid credentials");
UserPrincipal user = new UserPrincipal(theContext, "uatu", "Passw0rd", true);
user.Save();

Этот код по-прежнему не выполняется для пользователя.Сохранить().Если я явно задаю имя пользователя и пароль, совпадающие с именем зарегистрированного пользователя в конструкторе PrincipalContext, я получаю успех.

PrinicipalContext  theContext = new PrincipalContext(ContextType.Domain,"<address>", "<domain context>", "<username>", "<password>");
UserPrincipal user = new UserPrincipal(theContext, "uatu", "Passw0rd", true);
user.Save();

Этот код завершается успешно.Но я бы предпочел, чтобы пользователи не входили в мое приложение после того, как они вошли на свой компьютер с такими же учетными данными.

Я немного слышал о «Партнерском приложении», поэтому мне интересно,Я должен сообщить Active Directory, что он может доверять моему приложению.Я все еще не могу понять подробности и не знаю, является ли это неправильным направлением.

У кого-нибудь есть идеи относительно того, что мне следует делать?

1 Ответ

3 голосов
/ 01 февраля 2011

Если вы пытаетесь изменить UserPrincipals, у вас есть несколько вариантов:

  1. Пользователь уже аутентифицирован в windows как пользователь с правами на редактирование активной директории:
    • Используйте конструктор для PrincipalContext, который не принимает имя пользователя / пароль
      • Это запустит контекст как зарегистрированный в данный момент пользователь
    • Выполнить запрос, var usr = UserPrincipal.FindByIdentity(ctx, "bob@domain.local");
    • Выполнение манипуляций с usr объектом
    • Позвоните usr.Save(); на возвращенного пользователя из запроса.
  2. Пользователь проходит проверку подлинности в Windows, но вы должны «выдать себя за пользователя» с разрешением AD
    • Используйте конструктор для PrincipalContext, который принимает имя пользователя / пароль
      • Это запустит контекст как учетные данные, которые вы передали в
    • Выполнить запрос, var usr = UserPrincipal.FindByIdentity(ctx, "bob@domain.local");
    • Выполнение манипуляций с usr объектом
    • Позвоните usr.Save(); на возвращенного пользователя из запроса.

Исходя из вашего объяснения выше, я предполагаю, что вам нужен вариант № 1. ValidateCredentials(); используется только для проверки учетных данных, он возвращает true / false, если предоставленные вами учетные данные действительны. Вызов его не имеет длительного эффекта, он только подтверждает. Если вам нужно выдать себя за пользователя, вам нужно использовать конструктор PrincipalContext, который принимает учетные данные.

...