Россия, Владимир, Владимирский государственный университет, 2002 |
Принцип единого входа (Single sign-on)
Событие kFilterRawRequest
Все фильтры, загруженные на данный момент и поддерживающие это событие, уведомляются о том, что были изучены все входящие заголовки HTTP. Любой фильтр, которому необходима предварительная обработка входящих заголовков, может сделать это в данный момент времени. Обратите внимание на то, что в данный момент времени фильтр мог бы выбрать полное обслуживание запроса HTTP. Параметр pEventData является указателем на структуру FilterRawRequest.
Событие kFilterParsedRequest
Все фильтры, загруженные на данный момент и поддерживающие это событие, уведомляются о нем, когда стек HTTP заканчивает предварительный анализ всех входящих заголовков HTTP. Обратите внимание на то, что это отражает состояние, аналогичное состоянию в событии kFilterRawRequest, так как стек HTTP предварительно анализирует входящие заголовки HTTP перед тем, как начнет вызывать какой-либо фильтр. На этом шаге для полной обработки запроса вновь может быть выбран любой фильтр. Параметр pEventData является указателем на структуру FilterParsedRequest. Обратите внимание на то, что предусмотрены только две функции обратного вызова. На этом шаге вы можете получить доступ только к входящим заголовкам HTTP. Вы также имеете возможность изменить их с помощью kFilterRawRequest.
Событие kFilterRewriteURL
Все фильтры, загруженные на данный момент и поддерживающие это событие, имеют возможность изменить URL-адрес для перенаправления запроса на некий другой ресурс. Если фильтр успешно переписывает URL-адрес для обработки и сервер обрабатывает этот новый URL-адрес, то после этого на уровне DSAPI обработка данного события заканчивается, а это означает, что другие фильтры в списке не будут уведомляться. Параметр pEventData является указателем на экземпляр структуры FilterMapURL. Обратите внимание на тот факт, что FilterMapURL используется также в таких событиях, как kFilterTranslateRequest и kFilterPostTranslate.
Событие kFilterAuthenticate
Это событие происходит, когда стек HTTP находится в фазе аутентификации процесса. Код фильтра способен осуществить просмотр запроса и мандата пользователя, произвести аутентификацию пользователя по отношению к стеку HTTP или полностью обработать запрос. Параметр pEventData является указателем на экземпляр структуры.
Событие kFilterUserNameList
Это событие происходит, когда стек HTTP близок к генерированию списка имен групп пользователя. Это имена групп, членами которых является пользователь. Данное событие следует за событием kFilterAuthenticate. Этот фильтр может либо устанавливать, что сервер Domino заполняет список, добавляет или удаляет группы из списка, либо полностью обрабатывать событие (полностью самостоятельно генерировать список групп). Параметр pEventData в функции HttpEventProc является указателем на структуру FilterUserNameList.
Событие kFilterTranslateRequest
Это событие происходит, когда стек HTTP близок к преобразованию URL-адреса пути в целевой ресурс. Фильтр может либо преобразовывать запрос с использованием своих собственных правил преобразования и построения соответствий, либо полностью обрабатывать запрос. Параметр pEventData является указателем на экземпляр структуры FilterMapURL.
Событие kFilterPostTranslate
Это событие происходит после того, как было обработано событие kFilterTranslateEvent. Для фильтра это возможность изменить целевой ресурс, к которому осуществляется доступ. Фильтр может изменять как путь целевого ресурса, так и тип построения соответствий. Фильтр может также выбрать полное обслуживание запроса. Параметр pEventData является указателем на экземпляр структуры FilterMapURL.
Событие kFilterAuthorized
Это событие происходит после того, как имела место фаза аутентификации и был вычислен список имен групп пользователя. Фильтр может отвергнуть реализацию фазы авторизации по умолчанию и либо предоставить доступ к целевому ресурсу либо отказать в нем. Параметр pEventData является указателем на структуру FilterAuthorize. Она содержит информацию об используемом целевом ресурсе. Обратите внимание на тот факт, что фильтр может получить доступ к информации аутентифицированного пользователя путем применения служб при помощи функции обратного вызова ServerSupport с установленным флагом kGetAuthenticatedUserInfo. Это даст возможность пользователю получить доступ к аутентифицированному имени пользователя, а также к его или ее списку имен групп.
Если фильтр отказывает в доступе к целевому ресурсу, он должен отправить клиенту соответствующий ответ и установить поле isAuthorized структуры FilterAuthorize в значение 0. После этого он может вернуть либо kFilterHandledRequest, либо kFilter-HandledEvent. После этого на уровне DSAPI стеку HTTP будет подан сигнал на завершение обработки текущего запроса.
Событие kFilterProcessRequest
Это последний шаг в обслуживании запроса HTTP. Это событие может быть использовано для отклонения реализации обработки запроса по умолчанию. На этой стадии данные для ответа вычисляются и отправляются клиенту. Параметр pEventData является указателем на структуру FilterMapURL.
Событие kFilterEndRequest
Это событие используется для информирования кода фильтра о том, что наступило время для обновления и освобождения ресурсов, выделенных для обработки заданного запроса HTTP. Параметр pEventData в этом случае имеет значение NULL.
Событие kFilterAuthUser
Это событие заменено событием kFilterAuthenticate, но все еще поддерживается для обеспечения совместимости с написанными ранее фильтрами DSAPI. При этом событии фильтр осуществляет аутентификацию Web-пользователя. Параметр pEventData является экземпляром структуры FilterAuthenticate. Использование приведено в описанном ранее событии kFilterAuthenticate.
Это событие позволяет вам осуществлять настройку аутентификации Web-пользователей, которая зачастую является единственной частью реализации принципа единого входа в корпорации. В этом случае фильтр DSAPI уведомляется, когда Domino осуществляет аутентификацию пользователя. После этого фильтр DSAPI может проанализировать имя пользователя, проверить достоверность имен пользователей и паролей по отношению к действующей основной системе и, если проверка прошла успешно, уведомить Web-сервер Domino, что он обрабатывал аутентификацию пользователя, а также вернуть Domino мандат пользователя.
Далее приведено руководство по настройке выходных переменных и кодов возврата для общих сценариев аутентификации, когда eventData указывает на структуру FilterAuthenticate.
Сценарий 1. Фильтр был способен провести аутентификацию пользователя.
Установите eventData > authName в каноническое имя, установите eventData > authType в kAuthenticBasic или kAuthenticClientCert, а код возврата в kFilterHandledEvent.
Сценарий 2. Фильтр был неспособен провести аутентификацию пользователя, а другие фильтры или Domino должны двигаться вперед и предпринимать попытки проведения своей собственной аутентификации.
Установите код возврата в kFilterNotHandled.
Сценарий 3. Фильтр был неспособен провести аутентификацию пользователя, а другие фильтры или Domino не должны предпринимать попытки проведения своей собственной аутентификации.
Установите eventData > authType в kNotAuthentic, а код возврата в kFilterHandledEvent.
Событие kFilterResponse
Это событие происходит, когда стек HTTP близок к отправке заголовков ответа HTTP клиенту. Это дает фильтру шанс изменить отправляемый клиенту ответ. Данное явление не полностью реализовано в текущей версии DSAPI. Параметр pEventData является указателем на экземпляр структуры FilterResponse.
Событие kFilterRawWrite
Это событие происходит, когда стек HTTP близок к отправке данных ответа HTTP клиенту. Это дает фильтру шанс изменить отправляемые клиенту данные ответа. Это не полностью реализовано в текущей версии DSAPI. Параметр pEventData является указателем на экземпляр структуры FilterRawWrite.
Из описанных здесь событий для конструирования пользовательской реализации SSO мы заинтересуемся главным образом событиями kFilterAuthenticate, kFilterUserNameList и kFilterAuthorized. Обратите внимание на тот факт, что вместо события kFilterAuthenticate может также использоваться kFilterAuthUser, хотя оно и является событием версии 5, которое поддерживается в Domino 6 в целях обеспечения обратной совместимости. Новые фильтры DSAPI должны использовать событие kFilterAuthenticate.
Анализ работы и программирования
Функции DSAPI включены в инструментарий Lotus C API Toolkit, который может быть загружен с адреса:
Фильтр DSAPI скомпонован как общая библиотека (shared library) под UNIX и как DLL-файл под Win32. DSAPI поддерживается во всех платформах серверов Domino. Так как фильтр написан на языке С, вы можете использовать API языка С Notes для доступа к данным Domino либо другие интерфейсы С для доступа к другим системам. Детали компиляции и компоновки общей библиотеки отличаются в зависимости от платформы. Обратите внимание на тот факт, что инструментарий API языка С Lotus для Domino 6 не является обратносовместимым, означая тем самым, что программы, разработанные с применением инструментария 6.х, не будут работать в предшествующих шестой версиях Domino. Если вы имеете среду Domino R5 или смешанную среду R5 и Domino 6, вы должны использовать инструментарий R5.x.
Фильтр DSAPI является серверным расширением, и поэтому при доступе к базам данных Domino посредством API языка С фильтр имеет привилегии ID сервера.
Так как функции уведомления фильтра могут быть вызваны одновременно из различных потоков сервера, все коды фильтров должны быть защищены по потоку. Когда поток сервера Domino получает запрос HTTP, он выделяет память под новый экземпляр структуры FilterContext. Когда поток обработает запрос, он передает этот экземпляр всем функциям фильтра, которые он вызывает. FilterContext содержит указатель privateContext, который вы можете использовать для хранения своей собственной структуры данных. Все специфические данные потока, которые фильтру необходимо обслуживать от события к событию, должны сохраняться в вашей структуре privateContext.
Вы должны применять функцию обратного вызова AllocMem для распределения в вашем фильтре динамической памяти. Вся память, распределенная AllocMem, автоматически освобождается, когда поток сервера завершает обработку запроса. Это упрощает очистку ресурсов вашего фильтра и гарантирует, что память освобождается, даже если поток закончился аварийно.
Установите фильтр посредством указания имени фильтра в записи Server поля имени файла фильтра DSAPI в пунктах меню Internet Protocols (интернет-протоколы) > HTTP table (Таблица HTTP). Вы можете указать только имя файла фильтра, если он расположен в каталогах программ или данных Domino; в противном случае вы должны указать полное имя файла. Убедитесь в том, что всем файлам фильтров обеспечена безопасность посредством соответствующих файловых разрешений и обеспечения физической безопасности в целях предотвращения подделки фильтра со стороны неавторизованных пользователей.
DSAPI и LTPA
Инструментарий API языка С Domino 6 предоставляет для работы с маркерами LTPA две функции:
- SECTokenValidate – проверка достоверности маркера LTPA SSO;
- SECTokenGenerate – генерирование маркера LTPA SSO.
Эти две функции соответствуют расшифровке и шифрованию маркеров LTPA, описанных ранее в разделе, посвященном LTPA.