Как обрабатывать аутентификацию клиента для защищенной веб-службы в Delphi?

#web-services #delphi #sharepoint #authentication #delphi-2010

#веб-сервисы #delphi #sharepoint #аутентификация #delphi-2010

Вопрос:

В моей сети запущен сервер SharePoint, и я пытаюсь создать приложение на Delphi, которое позволяет мне получать доступ к различным веб-службам SharePoint, размещенным там.

Запуск моего приложения в той же сети, что и сервер SharePoint, работает нормально, однако, когда я пытаюсь запустить его на виртуальной машине, которая не является частью того же домена, я не могу пройти проверку подлинности. Я искал несколько советов относительно того, как я должен обрабатывать аутентификацию для этого типа сценария, более конкретно, должен ли я запрашивать у пользователя его учетные данные или есть какая-то встроенная модель безопасности, которую я могу использовать для этого?

В идеале я хотел бы попытаться избежать работы с именами пользователей и паролями в моем приложении и позволить ОС обрабатывать подобные вещи, однако на данный момент я, похоже, не вижу другого способа обойти это.

Комментарии:

1. Сначала вам нужно знать, какие методы аутентификации поддерживаются SharePoint (например, Basic, Digest, NTLM, Kerberos) и какой из них активен в данный момент. NTLM не требует взаимодействия с пользователем, но другой домен должен быть «доверенным» iirc. Базовая аутентификация требует, чтобы приложение отправляло имя пользователя / пароль, поэтому требуется взаимодействие с пользователем, если пароли где-то не заданы жестко.

2. @mjn Насколько я понимаю, что происходит, когда я пытаюсь получить доступ к веб-сервису, я получаю 401, и сервер должен ответить заголовком WWW-Authenticate, указывающим, какие типы аутентификации он поддерживает. Так что на этом этапе мне нужно будет перехватить это и запросить у пользователя учетные данные? Цель здесь — позволить пользователям открывать файлы с любого сервера SharePoint независимо от того, где они запускают мое приложение, поэтому могут быть сценарии, в которых домены не являются «доверенными» и требуют олицетворения.

3. В принципе, это правильно, но для предоставления учетных данных может потребоваться много кода и шагов взаимодействия клиент / сервер, что гораздо проще решить с помощью существующего кода. Internet Direct (Indy) поддерживает NTLM, поэтому он будет обрабатывать учетные данные в фоновом режиме при отправке HTTP POST. Просто добавьте необходимые модули обработки аутентификации в проект (Indy автоматически регистрирует их автоматически) и используйте отладчик, чтобы посмотреть, насколько это работает.

4. @mjn В настоящее время я использую Indy, и я добавил IdAuthenticationNTLM модуль, и он обрабатывает все функции NTLM, если я подключен к сети. Однако, как я уже сказал, когда я не в сети, я просто получаю 401, поскольку мои учетные данные будут неверными. Я бы хотел повторно использовать существующий код для обработки этого (например, запрашивать у пользователя учетные данные и отправлять по проводам), однако проблема в том, что я не знаю, как это сделать. Я попытаюсь включить блоки IdAuthenticationDigest amp; IdAuthenticationSSPI , чтобы узнать, автоматически ли он обнаруживает это и запрашивает.

5. Вам необходимо убедиться, что сервер настроен на прием этих типов авторизации.

Ответ №1:

После некоторого исследования, для моего конкретного сценария я решил, что лучшим подходом будет использование WinInet. Я выбрал этот подход вместо Indy, потому что после некоторого тщательного расследования я обнаружил, что в Indy были некоторые ошибки, а также в нем не было всей встроенной обработки аутентификации, в которой мы нуждались.

WinInet поддерживает запрос учетных данных и автоматическую аутентификацию по сети. См. раздел Обработка аутентификации.