Мне нужно создать метод для веб-приложения моей интрасети, который будет аутентифицировать пользователя, используя DirectoryServices
, либо по умолчанию, либо по указанному пользователем.Проверка подлинности через домен с помощью DirectoryServices
На моей форме авторизации пользователь сможет либо дать там учетные данные в виде "username"
и "password
»или "domain\username"
и "password"
Первый случай может быть использован, когда пользователь находится в том же домене, что и веб-сервер и . вполне straightfoward код я использую:
string domain = "";
// Code to check if the username is in form of "domain\user" or "user"
string username = ParseUsername(username, out domain);
if(domain == "")
domain = defaultDomain;
PrincipalContext context = new PrincipalContext(ContextType.Domain, domain, username, password);
bool IsAuthenticated = context.ValidateCredentials(username, password)
Я прохожу имя пользователя и пароль в конструктор PrincipalContext, чтобы связать вызов в тех случаях, когда я пытаюсь получить доступ к другому домену
для локального домена.код работает отлично. Однако, когда я пытаюсь проверить другой домен, который указан через имя пользователя, я получаю сообщение об ошибке «Сервер не может быть связан».
Я также пробовал использовать разные ContextOptions
, такие как ContextOptions.SimpleBind
или ContextOptions.Negotiate
, но я всегда получаю одинаковый результат.
Мне нужно реализовать это, так как приложение отправляется различным клиентам с однопользовательской или несколькими доменами. Есть ли что-то еще, что я должен указать в случаях «удаленных» доменов? Код должен быть гибким, поскольку он будет развернут в различных средах.
Благодаря
EDIT: Я должен отметить, что я предпочитаю делать это с помощью DirectoryServices.AccountManagement
и PrincipalContext
для того, чтобы воспользоваться другими функциями, что обеспечивает также.
Кроме того, я должен упомянуть, что для моих тестов моя машина Dev находится в сети 10.0.0. *, А второй домен, на который я тестирую, находится на 10.0.1. *. У меня есть маршрут и все, и я могу успешно подключиться с помощью клиента ldap, поэтому вопрос в том, почему я не могу подключиться к домену через мое приложение asp.net.
Ограничения безопасности - это мое первое предположение. Однако в более старой реализации метода я использовал это с помощью DirectoryEntry и DirectorySearcher более старых библиотек .NET 2.0. В этом случае мне нужно было передать имя пользователя и пароль, чтобы связать вызов, и это решит проблему с двойным перерывом. Теперь, похоже, я вообще не подключаюсь. Главное отличие теперь в том, что я должен разрешить пользователям указывать домен, к которому они принадлежат, чтобы быть более универсальным. –
У меня была аналогичная проблема, когда место, в котором я работал, решило перейти на новый домен. Во время процесса миграции нам нужно было поддерживать оба домена активными. В этом я обнаружил, что есть проблемы доверия, но никогда не мог найти решения для этого. Вместо этого я пошел с подходом WinNT, где я бы искал идентификатор пользователя по всей сети, получал этот объект, а затем выполнял манипуляции по мере необходимости. Также была проведена проверка задержек для обоих методов, чтобы убедиться, что это WinNT выполнимо, и оказалось, что это хороший выбор. – gizgok
@NikosSteiakakis Если вы выясните решение, напишите его здесь. – gizgok