Проверка подлинности passport в WinHTTP

Службы HTTP Microsoft Windows (WinHTTP) полностью поддерживают использование протокола проверки подлинности Microsoft Passport на стороне клиента. В этом разделе приводятся общие сведения о транзакциях, участвующих в проверке подлинности Passport, и о том, как их обрабатывать.

Примечание

В WinHTTP 5.1 проверка подлинности Passport отключена по умолчанию.

 

Passport 1.4

Passport — это основной компонент служб стандартных блоков Microsoft .NET. Это позволяет компаниям разрабатывать и предлагать распределенные веб-службы в широком спектре приложений, а также позволяет ее участникам использовать одно имя и пароль для входа на всех веб-сайтах-участниках.

WinHTTP обеспечивает поддержку платформы для Microsoft Passport 1.4 путем реализации клиентского протокола для проверки подлинности Passport 1.4. Он освобождает приложения от сведений о взаимодействии с инфраструктурой Passport и сохраненными именами пользователей и паролями в Windows XP. Эта абстракция делает использование Passport ничем не отличается от точки зрения разработчика, чем использование традиционных схем проверки подлинности, таких как Basic или Digest.

Windows XP: Раздел реестра HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Passport\NumRegistrationRuns определяет количество отображений мастера проверки подлинности passport при необходимости проверки подлинности PassPort. Если для этого ключа задано число больше 5, мастер не отображается.

В следующих разделах описаны транзакции, связанные с проверкой подлинности Passport с точки зрения клиентского приложения. Сведения о разработке Passport на стороне сервера см. в документации по пакету SDK для Passport.

Первоначальный запрос

Когда клиент запрашивает ресурс на сервере, который требует проверки подлинности Passport, сервер проверяет запрос на наличие билетов. Если с запросом отправляется действительный билет , сервер отвечает запрошенным ресурсом. Если запрос не существует на клиенте, сервер отвечает кодом состояния 302. Ответ содержит заголовок запроса "WWW-Authenticate: Passport1.4". Клиенты, которые не используют Passport, могут перейти на сервер входа Passport. Более сложные клиенты обычно обращаются к Passport nexus, чтобы определить расположение сервера входа Passport.

Примечание

Центральное место в сети Microsoft Passport занимает Passport Nexus, который упрощает синхронизацию сайтов участников Passport, чтобы гарантировать, что каждый сайт имеет последние сведения о конфигурации сети и других проблемах. Каждый компонент Passport (Passport Manager, серверы входа, серверы обновления и т. д.) периодически взаимодействует с Nexus для получения сведений, необходимых для поиска и правильного взаимодействия с другими компонентами в сети Passport. Эти сведения извлекаются в виде XML-документа, называемого документом конфигурации компонента или CCD.

 

На следующем рисунке показан первоначальный запрос к филиалу Passport.

На изображении показан первоначальный запрос к филиалу по паспорту.

Passport Login Server

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

Когда клиент запрашивает билеты с сервера входа Passport, сервер входа обычно отвечает кодом состояния 401, указывающим, что необходимо предоставить учетные данные пользователя. При указании этих учетных данных сервер входа отвечает запросами , необходимыми для доступа к указанному ресурсу на сервере, который содержит первоначально запрошенный ресурс. Сервер входа также может перенаправлять клиент на другой сервер, который может предоставить запрошенный ресурс.

На изображении показан запрос клиентского билета на сервер входа в паспорт.

Запрос, прошедший проверку подлинности

Если у клиента есть билеты , соответствующие данному серверу, эти билеты включаются во все запросы к серверу. Если билеты не были изменены с момента их получения с сервера входа Passport и билеты действительны для сервера ресурсов, сервер ресурсов отправляет ответ, содержащий запрошенный ресурс и файлы cookie, указывающие, что пользователь прошел проверку подлинности для будущих запросов.

Дополнительные файлы cookie в ответе предназначены для ускорения процесса проверки подлинности. Дополнительные запросы в том же сеансе для ресурсов на серверах в том же центре домена Passport включают эти дополнительные файлы cookie. Учетные данные не нужно отправлять на сервер входа до истечения срока действия файлов cookie.

Изображение: запрос, прошедший проверку подлинности, к серверу входа в passport.

Использование Passport в WinHTTP

Проверка подлинности passport в WinHTTP очень похожа на другие схемы проверки подлинности. Общие сведения о проверке подлинности в WinHTTP см. в статье Проверка подлинности в WinHTTP .

В WinHTTP 5.1 проверка подлинности Passport отключена по умолчанию и должна быть явно включена с помощью WinHttpSetOption перед использованием.

WinHTTP обрабатывает многие сведения о транзакциях внутри системы проверки подлинности Passport. Во время первоначального запроса сервер отвечает кодом состояния 302, когда требуется проверка подлинности. Код состояния 302 фактически указывает на перенаправление и является частью протокола Passport для обеспечения обратной совместимости. WinHTTP скрывает код состояния 302 и обращается к Passport nexus, а затем к серверу входа. Приложение WinHTTP получает уведомление о коде состояния 401, отправляемом сервером входа для запроса учетных данных пользователя. Для приложения, однако, кажется, что состояние 401 исходит от сервера, с которого был запрошен ресурс. Таким образом, приложение WinHTTP не знает о взаимодействии с другими серверами и может обрабатывать проверку подлинности Passport с помощью того же кода, который обрабатывает другие схемы проверки подлинности.

Как правило, приложение WinHTTP отвечает на код состояния 401, предоставляя учетные данные проверки подлинности. Если учетные данные предоставляются с помощью WinHttpSetCredentials или SetCredentials для проверки подлинности по паспорту, учетные данные фактически отправляются на сервер входа, а не на сервер, указанный в запросе.

Однако при ответе на код состояния 407 приложение WinHTTP должно использовать WinHttpSetOption для предоставления учетных данных прокси-сервера, а не WinHttpSetCredentials. Так как WinHttpSetOption является менее безопасным способом предоставления учетных данных, его обычно следует избегать.

После получения билеты управляются внутри организации и автоматически отправляются на соответствующие серверы в будущих запросах.

Примечание

WinHTTP позволяет отключить автоматическое перенаправление, вызвав функцию WinHttpSetOption для флага WINHTTP_OPTION_DISABLE_FEATURE и указав значение WINHTTP_DISABLE_REDIRECTS. Отключение перенаправления не влияет на перенаправление, которое WinHTTP обрабатывает внутренне для транзакций Passport.

 

WinHTTP может успешно завершить проверку подлинности Passport, даже если приложение отключает автоматическое перенаправление. Однако после завершения проверки подлинности Passport необходимо выполнить неявное перенаправление с URL-адреса сервера входа Passport обратно в исходный URL-адрес. Это перенаправление не активируется HTTP-ответом 302, но неявно в протоколе Passport.

WinHTTP специально обрабатывает это неявное перенаправление. Если приложение отключило автоматическое перенаправление, WinHTTP требует, чтобы приложение предоставило WinHTTP "разрешение" на автоматическое перенаправление в этом особом случае.

Чтобы после проверки подлинности WinHTTP перенаправлялся на исходный URL-адрес, приложение должно зарегистрировать функцию обратного вызова с помощью WinHttpSetStatusCallback. После этого WinHTTP может уведомить приложение с помощью обратного вызова WINHTTP_CALLBACK_STATUS_REDIRECT, что позволяет приложению отменить перенаправление. Приложению не требуется предоставлять какие-либо функции в функции обратного вызова; регистрации обратного вызова достаточно, чтобы разрешить WinHTTP следовать этому специальному перенаправлению.

Сообщение ERROR_WINHTTP_LOGIN_FAILURE создается, если функция обратного вызова не задана приложением.

Passport Cobranding

В отличие от традиционных схем проверки подлинности, поддерживаемых WinHTTP, Passport может быть широко скомбрандирован. Получив код состояния 401, указывающий на задачу, приложение может получить изображение и текст для кобрендинга . Получите URL-адрес для графического кобрендинга , вызвав WinHttpQueryOption с флагом WINHTTP_OPTION_PASSPORT_COBRANDING_URL. Получите текст кобрендинга , вызвав WinHttpQueryOption с флагом WINHTTP_OPTION_PASSPORT_COBRANDING_TEXT. Эти элементы можно использовать для настройки диалогового окна сбора учетных данных.

Сохранение имен пользователей и паролей

В Windows XP представлена концепция сохраненных имен пользователей и паролей. Если учетные данные passport пользователя сохраняются с помощью мастера регистрации паспортов или стандартного диалогового окна учетных данных, они сохраняются в сохраненных именах пользователей и паролях. При использовании WinHTTP в Windows XP или более поздних версиях WinHTTP автоматически использует учетные данные из хранимых имен пользователей и паролей, если учетные данные не заданы явным образом. Это похоже на поддержку учетных данных входа по умолчанию для NTLM/Kerberos. Однако использование учетных данных Passport по умолчанию не зависит от параметров политики автоматического входа.

Отключение проверки подлинности по паспорту

Некоторым приложениям может потребоваться возможность отключения проверки подлинности Passport. Например, когда партнер Passport отвечает с исходным кодом состояния 302, может быть предпочтительнее следовать указанному перенаправлению и отображать страницу проверки подлинности HTML Passport, а не разрешать WinHTTP обрабатывать проверку подлинности внутри организации. Проверка подлинности по паспорту отключена в WinHTTP путем вызова функции WinHttpSetOption с параметром WINHTTP_OPTION_CONFIGURE_PASSPORT_AUTH и передачи значения WINHTTP_DISABLE_PASSPORT_AUTH. Позже его можно будет повторно включить с помощью WINHTTP_ENABLE_PASSPORT_AUTH.

Проверку подлинности по паспорту нельзя отключить при использовании объекта WinHttpRequest .

Как отмечалось ранее в этом разделе, проверка подлинности Passport отключена по умолчанию в WinHTTP 5.1 и должна быть явно включена с помощью WinHttpSetOption перед использованием.

Переопределения конфигурации Passport, используемые для тестирования

WinHTTP использует сведения о конфигурации, загружаемые с сервера Passport Nexus, для поддержки проверки подлинности Passport 1.4. По умолчанию этот безопасный (SSL- сервер) nexus.passport.com, а ресурс конфигурации — rdr/pprdr.asp, который называется "динамической" конфигурацией passport. Формат сведений — это пользовательский заголовок HTTP PassportURLs, за которым следуют пары атрибут-значение с разделителями-запятыми.

Например, "https://nexus.passport.com/rdr/pprdr.asp" возвращает следующие сведения о конфигурации:

PassportURLs: DARealm=Passport.net,
DALogin=login.passport.com/login2.asp,
DAReg=https://register.passport.com/defaultwiz.asp,
Properties=https://memberservices.passport.com/ppsecure/MSRV_EditProfile.asp,
Privacy=https://www.passport.com/consumer/privacypolicy.asp,
GeneralRedir=https://nexusrdr.passport.com/redir.asp,
Help=https://memberservices.passport.com/UI/MSRV_UI_Help.asp,
ConfigVersion=2
\r\n

Для WinHTTP относятся следующие части: DARealm, DALogin и ConfigVersion. По соображениям производительности они кэшируются в течение всего времени существования сеанса WinHTTP. Эти три значения могут быть переопределены приложениями, которые необходимы для работы с другой инфраструктурой паспортов, отличной от "активной" рабочей среды, изменив соответствующие параметры реестра в разделе

HKEY_LOCAL_MACHINE
   SOFTWARE
      Microsoft
         Windows
            CurrentVersion
               Internet Settings
                  WinHttp
                     Passport Test
LoginServerRealm (REG_SZ)    For example: abc.net
LoginServerUrl (REG_SZ)      For example: https://private-login.passport.com/login2.asp
ConfigVersion (REG_DWORD)    For example: 10

Если LoginServerUrl присутствует в реестре, WinHTTP не обращается к серверу nexus для получения других значений конфигурации. В этом случае значения LoginServerRealm и ConfigVersion также должны быть заданы в реестре для исправления значений.

Для тестирования может потребоваться приложение для скачивания конфигурации passport с сервера private nexus. Это можно сделать, переопределив два значения реестра в разделе

HKEY_LOCAL_MACHINE
   SOFTWARE
      Microsoft
         Windows
            CurrentVersion
               Internet Settings
                  WinHttp
                     Passport Test
NexusHost (REG_SZ)    e.g. private-nexus.passport.com
NexusObj(REG_SZ)      e.g. config/passport.asp

Проверка подлинности в WinHTTP