共用方式為


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 Manager、登入伺服器、補救伺服器等等,) 定期與 Nexus 通訊,以擷取它所需的資訊,並適當地與 Passport 網路中的其他元件通訊。 這項資訊會擷取為稱為元件組態檔或 CCD 的 XML 檔。

 

下圖顯示 Passport 聯盟的初始要求。

影像顯示 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 進行 Passport 驗證時,認證實際上會傳送至登入伺服器,而不是傳送至要求中所指出的伺服器。

不過,回應 407 狀態碼時, WinHTTP 應用程式必須使用 WinHttpSetOption 來提供 Proxy 認證,而不是 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 中停用 Passport 驗證,方法是使用 WINHTTP_OPTION_CONFIGURE_PASSPORT_AUTH 選項呼叫 WinHttpSetOption 函式,並傳遞值WINHTTP_DISABLE_PASSPORT_AUTH。 稍後可以使用 WINHTTP_ENABLE_PASSPORT_AUTH 重新啟用。

使用 WinHttpRequest 物件時,無法停用 Passport 驗證。

如本節稍早所述,在 WinHTTP 5.1 中預設會停用 Passport 驗證,而且必須先使用 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 會話的存留期內快取它們。 這三個值可以透過變更適當的登錄設定,覆寫這些值,這些值可由與「即時」生產設定以外的另一個 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 中的驗證