資格情報の種類の選択
"資格情報" とは、Windows Communication Foundation (WCF) が、クレームされた ID または機能を確立するために使用するデータです。たとえば、パスポートは、政府によって発行される、国籍または地域籍を証明するための資格情報です。WCF では、ユーザー名トークンや X.509 証明書など多数の形式を資格情報に使用できます。ここでは、資格情報について説明し、WCF で資格情報を使用する方法およびアプリケーションに適切な資格情報を選択する方法についても説明します。
多くの国や地域において、運転免許証は資格情報の一例です。運転免許証には、個人を識別する情報や能力を表すデータが記載されます。この免許証には、所有者の写真という形式で所有の証明が含まれています。免許証は、政府機関など、信頼された証明機関によって発行されます。免許証には発行機関印が押され (国や地域によってはホログラムが使用され) ており、これによって、改ざんあるいは偽造されたものではないことが示されています。
資格情報の提示には、データ自体の提示とデータの所有証明の提示が関与します。WCF では、トランスポートとメッセージの両方のセキュリティ レベルで、さまざまな種類の資格情報がサポートされています。例えば、WCF でサポートされている、ユーザー名と (X.509) 証明書の 2 種類の資格情報を考えてみましょう。
ユーザー名資格情報で、ユーザー名はクレームされた ID を表しており、パスワードは所有の証明に使用されます。この場合の信頼された証明機関とは、ユーザー名とパスワードを検証するシステムです。
X.509 証明書資格情報を使用する場合、サブジェクト名、サブジェクト代替名、または証明書内の特定のフィールドを ID のクレームとして使用し、Valid From 、Valid To などの他のフィールドで証明書の有効性を示すことができます。
トランスポート資格情報の種類
転送セキュリティ モードのバインディングによって使用できるクライアント資格情報の種類を次の表に示します。サービスを作成する際には、ClientCredentialType プロパティを次のいずれかの値に設定し、クライアントがサービスと通信するときに提供する必要がある資格情報の種類を指定します。この種類は、コードまたは構成ファイルで設定できます。
設定 | 説明 |
---|---|
None |
クライアントが資格情報を提示する必要がないことを指定します。匿名クライアントであると解釈されます。 |
Basic |
クライアントに基本認証を指定します。詳細については、RFC2617『HTTP Authentication: Basic and Digest Authentication』を参照してください。 |
Digest |
クライアントにダイジェスト認証を指定します。詳細については、RFC2617『HTTP Authentication: Basic and Digest Authentication』を参照してください。 |
Ntlm |
NT LAN Manager (NTLM) 認証を指定します。これは、何らかの理由で Kerberos 認証を使用できないときに使用されます。AllowNtlm プロパティを false に設定すると、フォールバックとしての NTLM の使用を無効にすることもできます。これにより、NTLM が使用されていれば、WCF はベスト エフォートで例外をスローするようになります。このプロパティを false に設定しても、ネットワーク経由で NTLM 資格情報が送信されなくなるとは限りません。 |
Windows |
Windows 認証を指定します。Windows ドメインで Kerberos プロトコルだけを指定するには、AllowNtlm プロパティを false (既定値は true) に設定する必要があります。 |
Certificate |
X.509 証明書を使用したクライアント認証を実行します。 |
Password |
ユーザーは、ユーザー名とパスワードを提供する必要があります。Windows 認証または他のカスタム ソリューションを使用して、ユーザー名とパスワードの組み合わせを検証します。 |
メッセージ クライアント資格情報の種類
メッセージ セキュリティを使用するアプリケーションを作成するときに使用できる資格情報の種類を次の表に示します。これらの値は、コードまたは構成ファイルで使用できます。
設定 | 説明 |
---|---|
なし |
クライアントが資格情報を提示する必要がないことを指定します。これは、匿名クライアントであると解釈されます。 |
Windows |
Windows 資格情報によって確立されたセキュリティ コンテキストで、SOAP メッセージ交換を実行できます。 |
Username |
ユーザー名資格情報を使用したクライアントの認証をサービスで要求できるようにします。WCF では、署名の生成やデータの暗号化など、ユーザー名を使用した暗号化操作は許可されていない点に注意してください。WCF では、ユーザー名資格情報の使用時に、トランスポートが確実にセキュリティで保護されます。 |
Certificate |
X.509 証明書を使用したクライアントの認証をサービスで要求できるようにします。 |
IssuedToken |
セキュリティ ポリシーに従って構成されるカスタム トークンです。既定のトークンの種類は、SAML (Security Assertion Markup Language) です。トークンは、セキュリティ トークン サービスによって発行されます。詳細については、次のトピックを参照してください。 フェデレーションと発行済みトークン. |
サービス資格情報のネゴシエーション モデル
ネゴシエーションとは、資格情報を交換することによって、クライアントとサービスとの間に信頼を確立するプロセスです。このプロセスは、ネゴシエーション プロセスの次の手順に必要な情報だけを公開するために、クライアントとサービスとの間で反復して実行されます。実際には、最後に、後続の操作で使用されるサービスの資格情報がクライアントに配信されます。
1 つの例外を除き、既定では、WCF のシステム指定のバインディングは、メッセージ レベルのセキュリティを使用しているときに、サービス資格情報を自動的にネゴシエートします (例外とは、BasicHttpBinding の場合です。このバインディングでは、既定ではセキュリティが有効化されません)。この動作を無効にするには、NegotiateServiceCredential プロパティと NegotiateServiceCredential プロパティを参照してください。
注 : |
---|
SSL セキュリティを .NET Framework 3.5 以降と共に使用すると、WCF クライアントは、証明書ストア内の中間証明書と SSL ネゴシエーション中に受信した中間証明書の両方を使用して、サービスの証明書に対して証明書チェーンの検証を実行します。.NET Framework 3.0 では、ローカルの証明書ストアにインストールされている中間証明書のみが使用されます。 |
帯域外ネゴシエーション
自動ネゴシエーションを無効にした場合、サービスにメッセージを送信する前にクライアント側にサービス資格情報が準備されている必要があります。これは、帯域外プロビジョニングとも呼ばれます。たとえば、指定された資格情報の種類が証明書で、自動ネゴシエーションが無効の場合、クライアントはサービス所有者に連絡し、証明書を受け取って、クライアント アプリケーションを実行しているコンピューターにインストールする必要があります。この方法は、たとえば B2B シナリオで、サービスにアクセスできるクライアントを厳密に制御することが必要な場合に使用される可能性があります。この帯域外ネゴシエーションは、電子メールで実行できます。X.509 証明書は、Microsoft 管理コンソール (MMC) の証明書スナップインなどのツールを使用して、Windows 証明書ストアに格納します。
注 : |
---|
ClientCredentials プロパティを使用して、帯域外ネゴシエーションによって取得した証明書をサービスに提供します。バインディングでは自動ネゴシエーションが許可されないので、BasicHttpBinding クラスを使用するときはこの操作が必要になります。このプロパティは、相関関係のない双方向シナリオでも使用します。このシナリオでは、クライアントが先にサーバーへの要求を送信する必要がなく、サーバーからクライアントにメッセージが送信されます。サーバーにはクライアントからの要求がないので、サーバーはクライアントの証明書を使用して、クライアントへのメッセージを暗号化する必要があります。 |
資格情報の値の設定
セキュリティ モードを選択したら、実際の資格情報を指定する必要があります。たとえば、資格情報の種類を "Certificate" に設定した場合、特定の資格情報 (特定の X.509 証明書など) をサービスまたはクライアントに関連付ける必要があります。
サービスをプログラミングしている場合とクライアントをプログラミングしている場合で、資格情報の値を設定する方法が少し異なります。
サービス資格情報の設定
トランスポート モードを使用し、HTTP をトランスポートとして使用する場合は、インターネット インフォメーション サービス (IIS) を使用するか、証明書でポートを構成する必要があります。詳細については、次のトピックを参照してください。、「トランスポート セキュリティの概要」および「HTTP トランスポート セキュリティ」を参照してください。
コードで資格情報をサービスに提供するには、ServiceHost クラスのインスタンスを作成し、Credentials プロパティからアクセスできる ServiceCredentials クラスを使用して適切な資格情報を指定します。
証明書の設定
クライアントに対するサービスの認証に使用される X.509 証明書をサービスに提供するには、X509CertificateRecipientServiceCredential クラスの SetCertificate メソッドを使用します。
クライアント証明書をサービスに提供するには、X509CertificateInitiatorServiceCredential クラスの SetCertificate メソッドを使用します。
Windows 資格情報の設定
クライアントが有効なユーザー名とパスワードを指定した場合、その資格情報がクライアントの認証に使用されます。それ以外の場合は、現在ログオンしているユーザーの資格情報が使用されます。
クライアント資格情報の設定
WCF では、クライアント アプリケーションは、WCF クライアントを使用してサービスに接続します。各クライアントは、ClientBase クラスから派生しています。各クライアントでは ClientCredentials プロパティを使用して、クライアント資格情報のさまざまな値を指定できます。
証明書の設定
サービスに対するクライアントの認証に使用される X.509 証明書をサービスに提供するには、X509CertificateInitiatorClientCredential クラスの SetCertificate メソッドを使用します。
サービスに対するクライアントの認証でのクライアント資格情報の使用
サービスとの通信に必要なクライアント資格情報は、ClientCredentials プロパティまたは Credentials プロパティを使用して提供されます。この情報は、サービスに対してクライアントを認証するためにセキュリティ チャネルで使用されます。認証は、次のいずれかの方法で実行されます。
クライアント資格情報を 1 回使用してから、セキュリティ コンテキストを確立するために、WCF クライアントのインスタンスを使用して最初のメッセージを送信します。アプリケーション メッセージはすべて、そのセキュリティ コンテキストで保護されます。
サービスに送信されたアプリケーション メッセージごとの認証に、クライアント資格情報を使用します。この場合、クライアントとサービスとの間にコンテキストは確立されません。
変更できない確立された ID
1 つ目の方法を使用した場合、確立されたコンテキストは、クライアント ID に永続的に関連付けられます。つまり、セキュリティ コンテキストが確立されると、クライアントに関連付けられた ID を変更できません。
注 : |
---|
ID の切り替えができないこと (つまり、セキュリティ コンテキストを確立する場合の既定の動作) について、注意が必要な状況があります。別のサービスと通信するサービスを作成する場合、この 2 番目のサービスに対して WCF クライアントを開くために使用した ID は変更できません。これは、複数のクライアントが最初のサービスを使用できる状況で、2 番目のサービスにアクセスするときに最初のサービスがクライアントを偽装する場合、問題になります。サービスがすべての呼び出し元に対して同じクライアントを再利用する場合、2 番目のサービスへの呼び出しはすべて、2 番目のサービスに対してクライアントを開くために使用した最初の呼び出し元の ID によって実行されます。つまり、このサービスでは、すべてのクライアントが 2 番目のサービスと通信できるように、最初のクライアントの ID が使用されます。これによって、権限の昇格が発生する可能性があります。これがサービスの目的の動作でない場合、各呼び出し元を追跡し、その呼び出し元ごとに 2 番目のサービスに対する新しいクライアントを作成する必要があります。これによって、適切な呼び出し元が 2 番目のサービスと通信するために、サービスは適切なクライアントだけを使用できます。 |
資格情報とセキュリティで保護されたセッション詳細情報、「セキュリティで保護されたセッションに関するセキュリティの検討」を参照してください。
参照
リファレンス
System.ServiceModel.ClientBase
System.ServiceModel.ClientBase.ClientCredentials
System.ServiceModel.Description.ClientCredentials.ClientCertificate
System.ServiceModel.BasicHttpMessageSecurity.ClientCredentialType
System.ServiceModel.HttpTransportSecurity.ClientCredentialType
System.ServiceModel.MessageSecurityOverHttp.ClientCredentialType
System.ServiceModel.MessageSecurityOverMsmq.ClientCredentialType
System.ServiceModel.MessageSecurityOverTcp.ClientCredentialType
System.ServiceModel.TcpTransportSecurity.ClientCredentialType
System.ServiceModel.Security.X509CertificateInitiatorClientCredential.SetCertificate(System.Security.Cryptography.X509Certificates.StoreLocation,System.Security.Cryptography.X509Certificates.StoreName,System.Security.Cryptography.X509Certificates.X509FindType,System.Object)
System.ServiceModel.Security.X509CertificateInitiatorClientCredential.SetCertificate(System.String,System.Security.Cryptography.X509Certificates.StoreLocation,System.Security.Cryptography.X509Certificates.StoreName)
System.ServiceModel.Security.X509CertificateInitiatorServiceCredential.SetCertificate(System.String,System.Security.Cryptography.X509Certificates.StoreLocation,System.Security.Cryptography.X509Certificates.StoreName)
概念
WCF セキュリティのプログラミング
HTTP トランスポート セキュリティ