WinHTTP 中的 Passport 身份验证

Microsoft Windows HTTP Services (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 与开发人员使用传统身份验证方案(如基本或摘要)没有什么不同。

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

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

初始请求

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

注意

Microsoft Passport 网络的核心是 Passport Nexus,它有助于同步 Passport 参与者站点,以确保每个站点都有有关网络配置和其他问题的最新详细信息。 每个 Passport 组件 (Passport 管理器、登录服务器、更新服务器等) 定期与 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 联合品牌

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