WinHTTP 中的 Passport 身份验证

Microsoft Windows HTTP 服务(WinHTTP)完全支持客户端使用 Microsoft Passport 身份验证协议。 本主题概述了 Passport 身份验证中涉及的事务以及如何处理它们。

注意

在 WinHTTP 5.1 中,默认情况下禁用 Passport 身份验证。

 

Passport 1.4

Passport 是 Microsoft .NET 构建基块服务的核心组件。 它使企业能够在各种应用程序中开发和提供分布式 Web 服务,并使其成员能够在所有参与的网站上使用一个登录名和密码。

WinHTTP 通过实现 Passport 1.4 身份验证的客户端协议,为 Microsoft Passport 1.4 提供平台支持。 它从与 Passport 基础结构和 Windows XP 中存储的用户名和密码交互的详细信息中释放应用程序。 这种抽象使使用 Passport 与使用基本或摘要等传统身份验证方案不同。

Windows XP:HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Passport\NumRegistrationRuns 注册表项标识需要 PassPort 身份验证时护照身份验证向导显示的次数。 如果此键的值设置为大于 5 的数字,则不会显示向导。

以下部分介绍从客户端应用程序的角度来看 Passport 身份验证所涉及的事务。 有关服务器端 Passport 开发,请参阅 Passport SDK 文档概述。

初始请求

当客户端请求需要 Passport 身份验证的服务器上的资源时,服务器会检查请求是否存在 票证。 如果使用请求发送有效的 票证,则服务器将使用请求的资源进行响应。 如果客户端上不存在 票证,则服务器将响应 302 状态代码。 响应包括质询标头“WWW-Authenticate: Passport1.4”。 未使用 Passport 的客户端可以按照重定向到 Passport 登录服务器。 更高级的客户端通常联系 Passport nexus 以确定 Passport 登录服务器的位置。

注意

Microsoft Passport 网络的核心是 Passport Nexus,这有助于同步 Passport 参与者站点,以确保每个站点都有有关网络配置和其他问题的最新详细信息。 每个 Passport 组件(Passport Manager、登录服务器、更新服务器等)都会定期与 Nexus 通信,以检索它需要查找并正确与 Passport 网络中的其他组件通信的信息。 此信息作为称为组件配置文档或 CCD 的 XML 文档进行检索。

 

下图显示了对 Passport 关联公司的初始请求。

图像显示对护照关联公司的初始请求。

Passport 登录服务器

Passport 登录服务器处理 Passport 域颁发机构中任何资源的 票证 的所有请求。 在使用 Passport 对请求进行身份验证之前,客户端应用程序必须联系登录服务器以获取相应的 票证

当客户端从 Passport 登录服务器请求 票证 时,登录服务器通常会使用 401 状态代码进行响应,以指示必须提供用户凭据。 提供这些凭据时,登录服务器将使用访问包含最初请求资源的服务器上的指定资源所需的 票证进行响应。 登录服务器还可以将客户端重定向到另一台可以提供所请求资源的服务器。

图像显示对 passport 登录服务器的客户端票证请求。

经过身份验证的请求

当客户端具有与给定服务器对应的 票证 时,这些 票证 包含在该服务器的所有请求中。 如果 票证 自从 Passport 登录服务器检索以来尚未修改,并且 票证 对资源服务器有效,则资源服务器会发送一个响应,其中包括请求的资源和 Cookie,这些响应指示用户对将来的请求进行身份验证。

响应中的其他 Cookie 旨在加快身份验证过程的速度。 同一 Passport 域颁发机构中服务器上资源的同一会话中的其他请求都包括这些额外的 Cookie。 在 Cookie 过期之前,无需再次将凭据发送到登录服务器。

图像显示对 passport 登录服务器进行身份验证的请求。

在 WinHTTP 中使用 Passport

WinHTTP 中的 Passport 身份验证与其他身份验证方案非常相似。 有关 WinHTTP 中的身份验证概述,请参阅 WinHTTP 中的 身份验证。

在 WinHTTP 5.1 中,Passport 身份验证默认处于禁用状态,在使用前必须使用 WinHttpSetOption 显式启用。

WinHTTP 在内部处理许多事务详细信息,用于 Passport 身份验证。 在初始请求期间,服务器在必要时使用 302 状态代码进行响应。 302 状态代码实际上指示重定向,并且是 Passport 协议的一部分,以实现向后兼容性。 WinHTTP 隐藏 302 状态代码,并联系 Passport nexus,然后与登录服务器联系。 WinHTTP 应用程序收到登录服务器发送的 401 状态代码以请求用户凭据的通知。 但是,对于应用程序,它看起来好像 401 状态源自请求资源的服务器。 这样,WinHTTP 应用程序就不知道与其他服务器的交互,并且可以使用处理其他身份验证方案的相同代码处理 Passport 身份验证。

通常,WinHTTP 应用程序通过提供身份验证凭据来响应 401 状态代码。 当凭据随 WinHttpSetCredentialsSetCredentials 进行护照身份验证时,凭据实际上会发送到登录服务器,而不是发送到请求中指定的服务器。

但是,当响应 407 状态代码时,WinHTTP 应用程序必须使用 WinHttpSetOption 来提供代理凭据,而不是 WinHttpSetCredentials。 由于 WinHttpSetOption 是一种不太安全的提供凭据的方法,因此通常应避免使用。

检索后,票证 在内部进行管理,并在将来的请求中自动发送到适用的服务器。

注意

使用 WinHTTP,可以通过为 WINHTTP_OPTION_DISABLE_FEATURE 标志调用 WinHttpSetOption 函数并指定 WINHTTP_DISABLE_REDIRECTS值来禁用自动重定向。 禁用重定向不会干扰 WinHTTP 在内部处理 Passport 事务的重定向。

 

即使应用程序禁用自动重定向,WinHTTP 也可以成功完成 Passport 身份验证。 但是,在 Passport 身份验证完成后,必须从 Passport 登录服务器 URL 返回原始 URL 进行隐式重定向。 此重定向不是由 302 HTTP 响应触发的,而是在 Passport 协议中隐式触发。

WinHTTP 专门处理此隐式重定向。 如果应用程序已禁用自动重定向,WinHTTP 要求应用程序在此特殊情况下自动重定向 WinHTTP“权限”。

若要在身份验证后将 WinHTTP 重定向回原始 URL,应用程序必须使用 WinHttpSetStatusCallback注册回调函数。 然后,WinHTTP 可以使用WINHTTP_CALLBACK_STATUS_REDIRECT回调通知应用程序,从而允许应用程序取消重定向。 应用程序不需要在回调函数中提供任何功能;回调注册足以使 WinHTTP 遵循此特殊情况重定向。

如果应用程序未设置回调函数,则会生成ERROR_WINHTTP_LOGIN_FAILURE消息。

Passport Cobranding

与 WinHTTP 支持的传统身份验证方案不同,Passport 可以广泛 共同品牌。 收到指示质询的 401 状态代码后,应用程序可以检索 共同品牌 图形和文本。 使用WINHTTP_OPTION_PASSPORT_COBRANDING_URL标志调用 WinHttpQueryOption,检索 联合品牌 图形的 URL。 通过使用WINHTTP_OPTION_PASSPORT_COBRANDING_TEXT标志调用 WinHttpQueryOption,检索 共同品牌 文本。 这些项可用于自定义凭据收集对话框。

存储的用户名和密码

Windows XP 引入了存储用户名和密码的概念。 如果用户的 Passport 凭据通过 Passport 注册向导 或标准 凭据对话框保存,则会将其保存在存储的用户名和密码中。 在 Windows XP 或更高版本上使用 WinHTTP 时,如果未显式设置凭据,WinHTTP 会自动使用存储的用户名和密码中的凭据。 这类似于支持 NTLM/Kerberos 的默认登录凭据。 但是,使用默认 Passport 凭据不受自动登录策略设置的约束。

禁用 Passport 身份验证

某些应用程序可能需要禁用 Passport 身份验证。 例如,当 Passport 关联使用初始 302 状态代码进行响应时,最好遵循指示的重定向并呈现 HTML Passport 身份验证页,而不是允许 WinHTTP 在内部处理身份验证。 使用 WINHTTP_OPTION_CONFIGURE_PASSPORT_AUTH 选项调用 WinHttpSetOption 函数并传递值WINHTTP_DISABLE_PASSPORT_AUTH,从而在 WinHTTP 中禁用 Passport 身份验证。 稍后可以使用WINHTTP_ENABLE_PASSPORT_AUTH重新启用它。

使用 WinHttpRequest 对象时,无法禁用 Passport 身份验证。

如本节前面所述,Passport 身份验证在 WinHTTP 5.1 中默认处于禁用状态,并且在使用前必须显式启用 WinHttpSetOption

用于测试的 Passport 配置替代

WinHTTP 依赖于它从 passport nexus 服务器下载的配置信息来支持 Passport 1.4 身份验证。 默认情况下,此安全(SSL)服务器 nexus.passport.com,配置资源为 rdr/pprdr.asp,称为“live”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 会话的生存期内。 这三个值可以通过更改相应的注册表设置来替代应用程序,这些应用程序需要使用除“实时”生产设置以外的其他 passport 基础结构

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 设置为正确的值。

出于测试目的,应用程序可能需要从专用 nexus 服务器下载 passport 配置。 可以通过重写以下两个注册表值来完成此作

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 中的 身份验证