2013-03-25 2 views
3

Я использую следующий код C# в коде, расположенном за веб-формой, развернутой в пуле приложений ASP.NET 4 (4.0.30319) на Server1 и Server2.Защищенная аутентификация LDAP Проблема

PrincipalContext pc = new PrincipalContext(ContextType.Domain, "testnet.testad.org:636", "dc=testnet,dc=testad,dc=org"); 
bool validated = pc.ValidateCredentials(username, password, ContextOptions.Negotiate); 

Сервер1 работает: Windows Server 2003 SP2
IIS 6.0
ASP.NET версии 4.0.30319

Это занимает от 30-60 секунд для проверки подлинности в зависимости от опций.
(Примечание: с помощью регулярных LDAP сразу проверяет подлинность без задержки)

Сервер 2 бежит: Windows Server 2008 SP2
IIS 7.0
версия ASP.NET 4.0.30319

Запуск таже как Server1, Server2 аутентифицируется почти мгновенно.
(Я также пробовал код с другим сервером IIS 7.0 с теми же результатами)

Кто-нибудь сталкивался с этим вопросом раньше?
Есть ли альтернативный способ аутентификации на сервере IIS 6.0 или сервере IIS 7.0?
Есть ли что-то, что мне нужно для настройки, добавления, удаления и т. Д.,?

Спасибо за любую помощь по этому вопросу.

.............................................. .................................................. ..............................................

[Обновить]

Я включил wirehark при выполнении запроса аутентификации ldaps.
Я создал файл, содержащий все запросы через 636.
Его можно посмотреть здесь: Server1 636 traffic

Самые большие зазоры находятся между:

No. 1949 на 1.115583 сек - № 06788 на 14.501754 сек
и
No. 6803 на 14.64297 сек - № 11742 на 27,921379 сек

Все другие движения на этом порту происходит в течение одной секунды.

ПРИМЕЧАНИЕ. На сервере Server примерно одинаковое количество трафика, но все это происходит между 2-3 секундами.
Его можно посмотреть здесь: Server2 636 traffic

Я побежал команду NetStat -ano»и обнаружил следующие соединения для LDAPS, когда я Логин:

Прото Локальный адрес Внешний адрес Состояние PID
TCP 10.1.72.74:1761 10.1.72.54:636 УСТАНАВЛИВАЕТСЯ 3688
TCP 10.1.72.74:1800 10.1.72.54:636 УСТАНАВЛИВАЕТСЯ 3688
TCP 10.1.72.74:1825 10.1.72.54: 636 ESTABLISHED 3688

+0

Таким образом, используя порт 389, вызов auth происходит мгновенно - сертификаты, которые выдаются с обоих серверов при подключении более 636, являются теми же? Единственный раз, когда я заметил, что резкое замедление происходит, когда привязки рефералов не подавляются должным образом при авторизации. Не могли бы вы устранить попытку auth на Server1, чтобы узнать, где затишье в трафике? – X3074861X

+0

@ X3074861X Да, используя порт 389, вызов auth происходит мгновенно. Я не уверен в сертификатах, но у меня нет специальных сертификатов на моем ноутбуке dev, и он проверяет подлинность всего на 636 при отладке. Я побежал Wireshark и сделал попытку auth на Server1. Я обновил свой вопрос выше с результатами и расположением полного файла журнала со всем трафиком более 636. – Baxter

+0

Я прошел через эти журналы Wireshark, и, как вы, вероятно, заметили также, самая большая ошибка в трафике наблюдается во время TLS Последовательность квитирования. На сервере Server1 в средстве просмотра событий под системными журналами вы видите предупреждения или ошибки от Schannel? Вам может потребоваться определить SSL-соединение в дополнение к Соглашению: 'bool validated = pc.ValidateCredentials (имя пользователя, пароль, ContextOptions.Negotiate | ContextOptions.SecureSocketLayer);' – X3074861X

ответ

2

Посмотрите на мой ответ в ServerFault ...

Служба не может быть в состоянии получить доступ к:

C: \ Documents и Settings \ All Users \ Application Data \ Microsoft \ Crypto \ RSA \ MachineKeys

Ваше упоминание:

Дата: 25.03.2013 Время: 10:11:06 AM Источник: Schannel «Произошла фатальная ошибка при попытке доступа к учетным записям SSL-клиента ключ.

делает его вероятным.

+0

Я запустил монитор процесса и отфильтровал результаты по пути «Crypto \ RSA \ MachineKeys». Когда я запустил страницу входа в систему, я нашел много записей об отказах доступа к указанному вами пути. Я сделал записи журнала доступными здесь: [Журналы мониторинга процессов] (http://www.fullstackbusinessdesign.com/forums/ldaps/process-monitor-log.CSV). Какую учетную запись вы имеете в виду под «учетной записью службы» для предоставления доступа к нему? – Baxter

+0

Кроме того, в журналах операция «CreateFile», но папки и машинные ключи, к которым применяется операция, уже существуют? Результатом для папок является «Name Collision», а результатом для машинных клавиш является «Access Denied». – Baxter

+0

«NT AUTHORITY \ NETWORK SERVICE» получает отказ в доступе, поэтому дайте ему READ/Execute permissions – Daro

1

Проверьте записи реестра, чтобы узнать, какая версия SSL/TLS поддерживается; вопрос, который может привести к проблемам рукопожатия ... (см Сценарий 5 в ссылке, приведенной ниже)

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ SecurityProviders \ SCHANNEL \ Protocols

Для некоторых соответствующих сценариев и их разрешения имеют a читать troubleshooting ssl related issues server certificate

+0

Я проверил записи в реестре, которые вы упомянули, и нашел следующие протоколы: PCT 1.0, SSL 2.0, SSL 3.0, TLS 1.0. Нужно ли мне что-то делать с этим? У меня нет проблем с трафиком https за 443. Как описано выше, у меня возникают проблемы с трафиком ldaps за 636. Однако я следил за приведенным руководством и нашел: 1. У сертификата есть соответствующий закрытый ключ. 2. Я установил и проверил SSL-диагностику без ошибок. 3. Я побежал netstat -ano "добавил к вопросу выше. 4.Я запустил сетевой монитор и увидел те же промежутки времени. Все выглядит нормально, за исключением промежутков времени? – Baxter

+0

hmm ... another #note ... Если свойство ClientCertificates в объекте LdapConnection и свойство QueryClientCertificate объекта LdapSessionOptions установлено оба, сертификат, указанный в свойстве ClientCertificates, игнорируется ... т.е. ваши сертификаты ssl кажутся прекрасными, что сервер ldap извергается? –

+0

Это похоже на хорошее место для устранения неполадок/сужения проблемы ... Я бы следил за ней .. http: //support.microsoft.com/kb/290483 ... в частности, метод 3: использовать Microsoft Internet Explorer и метод 4: Использовать образец WebClient в SDK Microsoft Platform, кажется слишком простым, но может предоставить полезную информацию. –

1

PrincipalContextValidateCredentials метод в основном является оберткой для операции связывания LDAP. Двумя основными статьями, которые следует читать для этого, являются IADsOpenDSObject::OpenDSObject и LDAP ADsPath.

Вы используете SSL, поэтому вам нужно указать, что если вы хотите, чтобы он был максимально эффективным. Документация по ContextOptions аргумента метода ValidateCredentials на самом деле звучит как он не поддерживает это:

Сочетание одного или нескольких ContextOptions перечисления значений параметров, используемых для привязки к серверу. Этот параметр может указывать только Simple bind с SSL или без него или Negotiate bind.

Предполагая, что я искажая документацию и метод ValidateCredentials действительно поддержка определения Negotiate | SecureSocketLayer, вы должны смотреть на то, как вы передаете имя пользователя. В статье OpenDSObject, он дает этот совет от формата имени пользователя в:

Вы можете пройти в lpszUserName в качестве одного из следующих строк:

  1. Имя учетной записи пользователя, такие как «jeffsmith ». Чтобы использовать имя пользователя самостоятельно, вы должны установить только флаг ADS_SECURE_AUTHENTICATION в параметре lnReserved.

  2. Путь пользователя из предыдущей версии Windows NT, такой как «Fabrikam \ jeffsmith».

  3. Отличительное имя, такое как «CN = Jeff Smith, OU = Sales, DC = Fabrikam, DC = Com». Для использования DN параметр lnReserved должен быть равен нулю или должен содержать флаг ADS_USE_SSL

  4. Имя пользователя (UPN), например, «[email protected]». Чтобы использовать UPN, вы должны назначить соответствующее значение UPN для атрибута userPrincipalName целевого пользовательского объекта.

Вы установив флаг SSL, поэтому вы должны использовать 2, 3 или 4.

P.S. В вашем примере кода вы указываете DNS-имя домена в конструкторе. Если вы указываете сервер в своем реальном коде, вам нужно добавить флаг ServerBind.

+0

Код, который я использую, работает на трех других серверах: server2008, server2003 и Windows 7. Я считаю, что проблема связана с самим сервером, а не с кодом аутентификации, который я использую. – Baxter

+0

@Baxter Есть моменты, когда настройка правильных флагов имеет значение, например [этот вопрос] (http://stackoverflow.com/q/13406955/628981) –

Смежные вопросы