Win でのパスポート認証HTTP

Microsoft Windows HTTP Services (WinHTTP) は、Microsoft Passport 認証プロトコルのクライアント側での使用を完全にサポートします。 このトピックでは、Passport 認証に関連するトランザクションとその処理方法の概要について説明します。

注意

WinHTTP 5.1 では、Passport 認証は既定で無効になっています。

 

Passport 1.4

Passport は、Microsoft .NET 文書パーツ サービスのコア コンポーネントです。 これにより、企業は幅広いアプリケーションにわたって分散 Web サービスを開発および提供でき、メンバーは参加しているすべての Web サイトで 1 つのサインイン名とパスワードを使用できます。

WinHTTP は、Passport 1.4 認証用のクライアント側プロトコルを実装することで、Microsoft 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 開発については、Passport SDK ドキュメントの概要に関するページを参照してください。

最初の要求

クライアントが Passport 認証を必要とするサーバー上のリソースを要求すると、サーバーは 要求にチケットが存在することを確認します。 有効な チケット が要求と共に送信されると、サーバーは要求されたリソースで応答します。 チケットがクライアントに存在しない場合、サーバーは 302 状態コードで応答します。 応答には、チャレンジ ヘッダー "WWW-Authenticate: Passport1.4" が含まれます。 Passport を使用していないクライアントは、Passport ログイン サーバーへのリダイレクトに従うことができます。 より高度なクライアントは、通常、Passport のネクサスに問い合わせて、Passport ログイン サーバーの場所を決定します。

注意

Microsoft Passport ネットワークの中心となる Passport Nexus は、Passport 参加者サイトの同期を容易にして、各サイトがネットワーク構成やその他の問題に関する最新の詳細を確実に持っていることを保証します。 各 Passport コンポーネント (Passport Manager、ログイン サーバー、更新サーバーなど) は、Nexus と定期的に通信して、Passport ネットワーク内の他のコンポーネントを見つけ、適切に通信するために必要な情報を取得します。 この情報は、コンポーネント構成ドキュメント (CCD) と呼ばれる XML ドキュメントとして取得されます。

 

次の図は、Passport アフィリエイトへの最初の要求を示しています。

画像は、パスポートアフィリエイトへの最初の要求を示しています。

Passport Login Server

Passport ログイン サーバーは、Passport ドメイン機関内のリソースのチケットに対するすべての要求を処理します。 Passport を使用して要求を認証するには、クライアント アプリケーションがログイン サーバーに連絡して適切な チケットを取得する必要があります。

クライアントが Passport ログイン サーバーから チケット を要求すると、通常、ログイン サーバーは 401 状態コードで応答し、ユーザーの資格情報を指定する必要があることを示します。 これらの資格情報が指定されると、ログイン サーバーは、最初に要求されたリソースを含むサーバー上の指定されたリソースにアクセスするために必要な チケット で応答します。 ログイン サーバーは、要求されたリソースを提供できる別のサーバーにクライアントをリダイレクトすることもできます。

画像は、パスポート ログイン サーバーへのクライアント チケット要求を示しています。

認証済み要求

クライアントが特定のサーバーに対応する チケット を持っている場合、それらの チケット はそのサーバーへのすべての要求に含まれます。 Passport ログイン サーバーから取得されてから チケット が変更されておらず、 チケット がリソース サーバーに対して有効な場合、リソース サーバーは、要求されたリソースと、ユーザーが今後の要求に対して認証されることを示す Cookie の両方を含む応答を送信します。

応答の追加の Cookie は、認証プロセスを高速化するためのものです。 同じ Passport Domain Authority 内のサーバー上のリソースに対する同じセッション内の追加の要求には、これらの追加の Cookie が含まれます。 Cookie の有効期限が切れるまで、資格情報をログイン サーバーに再度送信する必要はありません。

イメージには、パスポート ログイン サーバーに対する認証済み要求が示されています。

Win での Passport の使用HTTP

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 では、WINHTTP_OPTION_DISABLE_FEATURE フラグの WinHttpSetOption 関数を呼び出し、WINHTTP_DISABLE_REDIRECTSの値を指定することで、自動リダイレクトを無効にすることができます。 リダイレクトを無効にしても、Passport トランザクションで WinHTTP が内部的に処理するリダイレクトは妨げられません。

 

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 では、保存されているユーザー名とパスワードの概念が導入されました。 ユーザーのパスポート資格情報が パスポート登録ウィザード または標準の 資格情報ダイアログで保存された場合、その資格情報は保存されたユーザー名とパスワードに保存されます。 Windows XP 以降で WinHTTP を使用する場合、WinHTTP では、資格情報が明示的に設定されていない場合、保存されているユーザー名とパスワードの資格情報が自動的に使用されます。 これは、NTLM/Kerberos の既定のログオン資格情報のサポートに似ています。 ただし、既定の Passport 資格情報の使用は、自動ログオン ポリシー設定の対象になりません。

Passport 認証の無効化

一部のアプリケーションでは、Passport 認証を無効にする機能が必要な場合があります。 たとえば、Passport アフィリエイトが最初の 302 ステータス コードで応答する場合は、WinHTTP が内部的に認証を処理できるようにするのではなく、示されたリダイレクトに従って HTML Passport 認証ページをレンダリングすることをお勧めします。 WinHTTP では、WINHTTP_OPTION_CONFIGURE_PASSPORT_AUTH オプションを使用して WinHttpSetOption 関数を呼び出し、値をWINHTTP_DISABLE_PASSPORT_AUTH渡すことで、パスポート認証が無効になります。 後で、WINHTTP_ENABLE_PASSPORT_AUTHを使用して再び有効にすることができます。

WinHttpRequest オブジェクトを使用している場合、パスポート認証を無効にすることはできません。

このセクションで前述したように、Passport 認証は WinHTTP 5.1 では既定で無効になっており、使用する前に WinHttpSetOption で明示的に有効にする必要があります。

テストに使用される Passport 構成のオーバーライド

WinHTTP は、Passport 1.4 認証をサポートするために passport Nexus サーバーからダウンロードする構成情報に依存しています。 既定では、このセキュリティで保護された (SSL) サーバーは nexus.passport.com され、構成リソースは rdr/pprdr.asp ("ライブ" パスポート構成と呼ばれます) です。 情報の形式は、カスタム 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 セッションの有効期間中にキャッシュされます。 これらの 3 つの値は、 で適切なレジストリ設定を変更することで、"ライブ" 運用セットアップ以外の別のパスポート インフラストラクチャを操作するために必要なアプリケーションによってオーバーライドできます

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 は他の構成値をネクサス サーバーに接続しません。 この場合、LoginServerRealm と ConfigVersion もレジストリを介して設定して値を修正する必要があります。

アプリケーションは、テスト目的で、プライベート ネクサス サーバーからパスポート構成をダウンロードする必要があります。 これは、 の 2 つのレジストリ値をオーバーライドすることで行うことができます。

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 での認証