資格情報 は、要求された ID または機能を確立するために Windows Communication Foundation (WCF) が使用するデータです。 たとえば、パスポートは、国または地域で市民権を証明するために政府が発行する資格情報です。 WCF では、資格情報は、ユーザー名トークンや X.509 証明書など、多くの形式を使用できます。 このトピックでは、資格情報、資格情報を WCF で使用する方法、アプリケーションに適した資格情報を選択する方法について説明します。
多くの国と地域では、運転免許証が資格情報の例です。 ライセンスには、個人の ID と機能を表すデータが含まれています。 所有者の絵の形で所有証明が含まれています。 ライセンスは、信頼できる機関 (通常は政府機関のライセンス部門) によって発行されます。 ライセンスは封印されており、ホログラムを含めることができます。ホログラムは改ざんまたは偽造されていないことを示しています。
資格情報を提示するには、データとデータの所有証明の両方を提示する必要があります。 WCF では、トランスポート セキュリティ レベルとメッセージ セキュリティ レベルの両方で、さまざまな種類の資格情報がサポートされています。 たとえば、WCF でサポートされている 2 種類の資格情報 (ユーザー名と (X.509) 証明書資格情報)を考えてみましょう。
ユーザー名の資格情報の場合、ユーザー名は要求された ID を表し、パスワードは所有証明を提供します。 この場合の信頼された機関は、ユーザー名とパスワードを検証するシステムです。
X.509 証明書資格情報を使用すると、証明書内のサブジェクト名、サブジェクトの別名、または特定のフィールドを ID の要求として使用できますが、 Valid From
フィールドや Valid To
フィールドなどの他のフィールドでは証明書の有効性を指定できます。
トランスポート資格情報の種類
次の表に、トランスポート セキュリティ モードでバインディングで使用できるクライアント資格情報の種類を示します。 サービスを作成するときに、 ClientCredentialType
プロパティを次のいずれかの値に設定して、クライアントがサービスと通信するために指定する必要がある資格情報の種類を指定します。 コード ファイルまたは構成ファイルで型を設定できます。
設定 | 説明 |
---|---|
無し | クライアントが資格情報を提示する必要がないように指定します。 これは匿名クライアントに変換されます。 |
ベーシック | クライアントの基本認証を指定します。 詳細については、「RFC2617- HTTP 認証: 基本認証とダイジェスト認証」を参照してください。 |
ダイジェスト | クライアントのダイジェスト認証を指定します。 詳細については、「RFC2617- HTTP 認証: 基本認証とダイジェスト認証」を参照してください。 |
NTLM | NT LAN Manager (NTLM) 認証を指定します。 これは、何らかの理由で Kerberos 認証を使用できない場合に使用されます。 また、 AllowNtlm プロパティを false に設定することで、フォールバックとしての使用を無効にすることもできます。これにより、NTLM が使用されている場合に WCF が例外をスローするためのベスト エフォートが発生します。 このプロパティを false に設定しても、NTLM 資格情報がネットワーク経由で送信されない場合があることに注意してください。 |
ウィンドウズ | Windows 認証を指定します。 Windows ドメインで Kerberos プロトコルのみを指定するには、 AllowNtlm プロパティを false (既定値は true ) に設定します。 |
証書 | X.509 証明書を使用してクライアント認証を実行します。 |
パスワード | ユーザーは、ユーザー名とパスワードを指定する必要があります。 Windows 認証または別のカスタム ソリューションを使用して、ユーザー名とパスワードのペアを検証します。 |
メッセージクライアントの資格情報タイプ
次の表は、メッセージ セキュリティを使用するアプリケーションを作成するときに使用できる資格情報の種類を示しています。 これらの値は、コード ファイルまたは構成ファイルで使用できます。
設定 | 説明 |
---|---|
無し | クライアントが資格情報を提示する必要がないように指定します。 これは匿名クライアントに変換されます。 |
ウィンドウズ | Windows 資格情報を使用して確立されたセキュリティ コンテキストで SOAP メッセージ交換を実行できるようにします。 |
ユーザー名 | ユーザー名の資格情報を使用してクライアントを認証することをサービスに要求できるようにします。 WCF では、署名の生成やデータの暗号化など、ユーザー名を使用した暗号化操作は許可されないことに注意してください。 WCF では、ユーザー名の資格情報を使用するときにトランスポートがセキュリティで保護されます。 |
証書 | サービスで、X.509 証明書を使用してクライアントの認証を要求できるようにします。 |
発行されたトークン | セキュリティ ポリシーに従って構成されたカスタム トークンの種類。 既定のトークンの種類は、セキュリティ アサーション マークアップ言語 (SAML) です。 トークンは、セキュリティで保護されたトークン サービスによって発行されます。 詳細については、「 フェデレーショントークンと発行済みトークン」を参照してください。 |
サービス資格情報のネゴシエーション モデル
ネゴシエーション は、資格情報を交換してクライアントとサービスの間の信頼を確立するプロセスです。 このプロセスは、ネゴシエーション プロセスの次のステップに必要な情報のみを開示するように、クライアントとサービスの間で繰り返し実行されます。 実際には、最終的な結果は、後続の操作で使用されるクライアントへのサービスの資格情報の配信です。
1 つの例外を除き、既定では、WCF のシステム提供のバインディングは、メッセージ レベルのセキュリティを使用するときにサービス資格情報を自動的にネゴシエートします。 (例外は BasicHttpBindingであり、既定ではセキュリティは有効になりません)。この動作を無効にするには、 NegotiateServiceCredential と NegotiateServiceCredential のプロパティを参照してください。
注
.NET Framework 3.5 以降で SSL セキュリティを使用する場合、WCF クライアントは、証明書ストアの中間証明書と SSL ネゴシエーション中に受信した中間証明書の両方を使用して、サービスの証明書に対する証明書チェーン検証を実行します。 .NET Framework 3.0 では、ローカル証明書ストアにインストールされている中間証明書のみが使用されます。
帯域外ネゴシエーション
自動ネゴシエーションが無効になっている場合は、サービスにメッセージを送信する前に、クライアントでサービス資格情報をプロビジョニングする必要があります。 これは帯域 外 プロビジョニングとも呼ばれます。 たとえば、指定した資格情報の種類が証明書で、自動ネゴシエーションが無効になっている場合、クライアントはサービス所有者に連絡して、クライアント アプリケーションを実行しているコンピューターに証明書を受信してインストールする必要があります。 これは、たとえば、企業間シナリオでサービスにアクセスできるクライアントを厳密に制御する場合などに実行できます。 この帯域外ネゴシエーションは電子メールで行うことができます。X.509 証明書は、Microsoft 管理コンソール (MMC) 証明書スナップインなどのツールを使用して Windows 証明書ストアに格納されます。
注
ClientCredentials プロパティは、帯域外ネゴシエーションによって取得された証明書をサービスに提供するために使用されます。 これは、バインディングで自動ネゴシエーションが許可されないため、 BasicHttpBinding クラスを使用する場合に必要です。 このプロパティは、独立型デュプレックスシナリオでも使用されます。 これは、サーバーがクライアントに最初に要求を送信しなくても、クライアントにメッセージを送信するシナリオです。 サーバーにはクライアントからの要求がないため、クライアントの証明書を使用してクライアントへのメッセージを暗号化する必要があります。
資格情報の値の設定
セキュリティ モードを選択したら、実際の資格情報を指定する必要があります。 たとえば、資格情報の種類が "証明書" に設定されている場合は、特定の資格情報 (特定の X.509 証明書など) をサービスまたはクライアントに関連付ける必要があります。
サービスとクライアントのどちらをプログラミングするかによって、資格情報の値を設定する方法が若干異なります。
サービス資格情報の設定
トランスポート モードを使用していて、トランスポートとして HTTP を使用している場合は、インターネット インフォメーション サービス (IIS) を使用するか、証明書を使用してポートを構成する必要があります。 詳細については、「 トランスポート セキュリティの概要 」と「 HTTP トランスポート セキュリティ」を参照してください。
コードで資格情報を使用してサービスをプロビジョニングするには、ServiceHost クラスのインスタンスを作成し、ServiceCredentials プロパティを介してアクセスするCredentials クラスを使用して適切な資格情報を指定します。
証明書の設定
クライアントに対するサービスの認証に使用する X.509 証明書を使用してサービスをプロビジョニングするには、SetCertificate クラスの X509CertificateRecipientServiceCredential メソッドを使用します。
クライアント証明書を使用してサービスをプロビジョニングするには、SetCertificate クラスの X509CertificateInitiatorServiceCredential メソッドを使用します。
Windows 資格情報の設定
クライアントが有効なユーザー名とパスワードを指定している場合、その資格情報はクライアントの認証に使用されます。 それ以外の場合は、現在ログオンしているユーザーの資格情報が使用されます。
クライアント資格情報の設定
WCF では、クライアント アプリケーションは WCF クライアントを使用してサービスに接続します。 すべてのクライアントは ClientBase<TChannel> クラスから派生し、クライアントの ClientCredentials プロパティを使用すると、クライアント資格情報のさまざまな値を指定できます。
証明書の設定
サービスに対するクライアントの認証に使用される X.509 証明書を使用してサービスをプロビジョニングするには、SetCertificate クラスのX509CertificateInitiatorClientCredentialメソッドを使用します。
クライアント資格情報を使用してサービスに対するクライアントを認証する方法
サービスとの通信に必要なクライアント資格情報は、 ClientCredentials プロパティまたは Credentials プロパティを使用して提供されます。 セキュリティ チャネルは、この情報を使用して、サービスに対してクライアントを認証します。 認証は、次の 2 つのモードのいずれかを使用して実行されます。
クライアント資格情報は、最初のメッセージが送信される前に、WCF クライアント インスタンスを使用してセキュリティ コンテキストを確立する前に 1 回使用されます。 その後、すべてのアプリケーション メッセージがセキュリティ コンテキストを通じてセキュリティで保護されます。
クライアント資格情報は、サービスに送信されるすべてのアプリケーション メッセージを認証するために使用されます。 この場合、クライアントとサービスの間にコンテキストは確立されません。
確立された ID を変更できない
最初のメソッドを使用すると、確立されたコンテキストはクライアント ID に永続的に関連付けられます。 つまり、セキュリティ コンテキストが確立されると、クライアントに関連付けられている ID を変更することはできません。
Von Bedeutung
ID を切り替えることができない場合 (つまり、セキュリティ コンテキストの確立がオンの場合、既定の動作) に注意する必要がある状況があります。 2 つ目のサービスと通信するサービスを作成した場合、WCF クライアントを 2 つ目のサービスに開くために使用される ID は変更できません。 これは、複数のクライアントが最初のサービスの使用を許可され、サービスが 2 番目のサービスにアクセスするときにクライアントを偽装する場合に問題になります。 サービスがすべての呼び出し元に対して同じクライアントを再利用する場合、2 番目のサービスへのすべての呼び出しは、2 番目のサービスへのクライアントを開くために使用された最初の呼び出し元の ID で行われます。 つまり、サービスは、すべてのクライアントが 2 番目のサービスと通信するために、最初のクライアントの ID を使用します。 これにより、特権がエスカレーションされる可能性があります。 これがサービスの望ましい動作でない場合は、各呼び出し元を追跡し、個別の呼び出し元ごとに 2 つ目のサービスに対して新しいクライアントを作成し、サービスが適切な呼び出し元に対して適切なクライアントのみを使用して 2 番目のサービスと通信するようにする必要があります。
資格情報とセキュリティで保護されたセッションの詳細については、「セキュリティで保護されたセッション のセキュリティに関する考慮事項」を参照してください。
こちらも参照ください
- System.ServiceModel.ClientBase<TChannel>
- ClientBase<TChannel>.ClientCredentials
- ClientCredentials.ClientCertificate
- BasicHttpMessageSecurity.ClientCredentialType
- HttpTransportSecurity.ClientCredentialType
- MessageSecurityOverHttp.ClientCredentialType
- MessageSecurityOverMsmq.ClientCredentialType
- MessageSecurityOverTcp.ClientCredentialType
- TcpTransportSecurity.ClientCredentialType
- X509CertificateInitiatorClientCredential.SetCertificate
- X509CertificateInitiatorServiceCredential.SetCertificate
- セキュリティの概念
- サービスとクライアントのセキュリティ保護
- WCF セキュリティのプログラミング
- HTTP トランスポート セキュリティ