правильный способ аутентификации, управления пользователями - сеансы
TIdHTTPServer
управляет HTTP сессий для вас, если вы установите TIdHTTPServer.SessionState
свойство истинно (ложно по умолчанию). TIdHTTPServer
использует файлы cookie для управления сеансом, поэтому вашим клиентам необходимо включить файлы cookie.
Аутентификация должна выполняться вручную, но как вы это делаете, зависит от того, используют ли ваши клиенты HTTP-аутентификацию или проверку подлинности на основе HTML.
Для аутентификации HTTP существует ARequestInfo.UserName
и ARequestInfo.Password
объектов. Если недействительно, отправьте соответствующий ответ 401 обратно клиенту (если вы установите для свойства AResponseInfo.AuthRealm
непустую строку, TIdHTTPServer
отправит вам ответ 401). По умолчанию TIdHTTPServer
поддерживает только аутентификацию BASIC
. Если вы хотите поддерживать другие схемы аутентификации, вам нужно будет использовать событие TIdHTTPServer.OnParseAuthentication
и отправить ответ 401 вручную, чтобы вы могли отправить соответствующие заголовки WWW-Authenticate
. В любом случае, если клиент проверен, вы можете использовать сеансы HTTP, чтобы клиент регистрировался между запросами. Объекты AResponseInfo.Session
и AResponseInfo.Session
указывают на текущий сеанс. Если TIdHTTPServer.AutoStartSession
истинно (по умолчанию оно ложно), TIdHTTPServer
автоматически создает новые сеансы. В противном случае вы можете позвонить по телефону TIdHTTPServer.CreateSession()
самостоятельно, если это необходимо. TIdHTTPSession
имеет свойство Content
, в котором вы можете хранить данные, относящиеся к сеансу. Или вы можете получить новый класс из TIdHTTPSession
, а затем использовать событие TIdHTTPServer.OnCreateSession
для создания экземпляров этого класса.
Для аутентификации HTML, у вас есть два варианта, в зависимости от того, как настроить HTML:
если ваш HTML <form>
тег не имеет атрибут enctype
, или он установлен в application/x-www-webform-urlencoded
, TIdHTTPServer
будет хранить необработанные данные веб-формы в свойстве ARequestInfo.FormParams
, и если значение TIdHTTPServer.ParseParams
истинно (по умолчанию оно), данные также будут проанализированы в свойстве ARequestInfo.Params
.
если ваш HTML <form>
тег имеет enctype
набор атрибутов для multipart/form-data
, вам придется разобрать содержание ARequestInfo.PostStream
вручную, так как TIdHTTPServer
еще не обрабатывает эти данные для вас (примеры были перед вывесили много раз на многих различные форумы о том, как вручную анализировать эти данные, используя класс Indy's TIdMessageDecoderMIME
). По умолчанию ARequestInfo.PostStream
указывает на объект TMemoryStream
. Вы можете использовать событие TIdHTTPServer.OnCreatePostStream
, чтобы создать экземпляр другого класса, отличного от TStream
, при желании.
главная проблема, соединение должно быть безопасным, поэтому требуется шифрование SSL, как это осуществить?
Перед запуском сервера:
назначить TIdServerIOHandlerSSLBase
-derived компонент, такой как TIdServerIOHandlerSSLOpenSSL
, к TIdHTTPServer.IOHandler
собственности и настроить его по мере необходимости (сертификат, проверки, равный SSL версии (ы), и т.д). В случае OpenSSL вам необходимо будет развернуть два файла библиотеки OpenSSL libeay32.dll
и ssleay32.dll
(или эквиваленты платформы не для Windows) с вашим приложением, если они еще не были предварительно установлены на целевой ОС или если вы хотите обеспечить приложение использует определенную версию OpenSSL. В это время OpenSSL - единственное шифрование, которое Indy поддерживает изначально, но существуют сторонние решения, совместимые с Indy, такие как EldoS SecureBlackbox.
заполните TIdHTTPServer.Binding
недвижимость со связующим для вашего желаемого порта HTTPS (443 - это порт HTTPS по умолчанию). Как правило, вы должны создать 2 привязки, один для HTTP-порта 80 и один для порта HTTPS 443. Внутри обработчиков OnCommand...
, если вы получаете запрос, требующий шифрования SSL/TLS, вы можете проверить порт, на который был сделан запрос (AContext.Binding.Port
) и если не HTTPS, то перенаправит (AResponseInfo.Redirect()
) клиент для повторного запроса запроса на порт HTTPS.
назначить обработчик к событию TIdHTTPServer.OnQuerySSLPort
и он установил свой параметр VUseSSL
Истину, если его параметр APort
соответствует вашему порту HTTPS.
Новые версии Indy можно загрузить из репозитория проекта Инди на http://www.indyproject.org/sockets/download/svn.en.aspx (XE2 довольно старая, так что новая Инди версия включает в себя множество ошибок исправлений и улучшений) – mjn
ну, я буду придерживаться XE2 на некоторое время. Удивительно, но когда я посетил ваш адрес в indyproject, я решил вернуться к старому хорошему форуму. прочитав проблему, связанную с обработчиком openssl, я заметил - догадался, что я слишком слепо следую за другим примером, добавив неверно некоторые параметры VerifyMode. так как-то я получил ssl режим запуска э ... вероятно, должен переписать вопрос –
@mjn: не забывайте http://www.indyproject.org/sockets/Docs/Indy10Installation.aspx, в котором есть важные примечания по установке. Для XE2 в частности: «* ошибочная зависимость от Indy была идентифицирована в пакете dclnet160.bpl от Embarcadero. Установка новой версии Indy приведет к тому, что этот пакет не будет правильно загружаться в среде IDE, предотвращая все содержащиеся в нем компоненты (такие как THTTPRIO, TXMLDocument, TWeb \ * Dispatcher, T \ * Producer, TTcp \ *, TUdp \ *), а также Wizards и Property Editors для них, начиная с момента разработки. * " –