クライアントのセキュリティ保護Securing Clients

Windows Communication Foundation (WCF) サービスは、クライアントのセキュリティ要件を決定します。In Windows Communication Foundation (WCF), the service dictates the security requirements for clients. つまり、使用するセキュリティ モード、およびクライアントが資格情報を提供するかどうかは、サービスによって指定されます。That is, the service specifies what security mode to use, and whether or not the client must provide a credential. そのため、クライアントをセキュリティで保護するプロセスは、サービスから取得したメタデータ (公開されている場合) を使用してクライアントを構築するという簡単なものになります。The process of securing a client, therefore, is simple: use the metadata obtained from the service (if it is published) and build a client. クライアントを構成する方法は、メタデータによって指定されます。The metadata specifies how to configure the client. クライアントが資格情報を提供することをサービスが要求する場合、要件に適した資格情報を取得する必要があります。If the service requires that the client supply a credential, then you must obtain a credential that fits the requirement. ここでは、このプロセスについて詳しく説明します。This topic discusses the process in further detail. セキュリティで保護されたサービスを作成する方法の詳細については、次を参照してください。 Securing Servicesします。For more information about creating a secure service, see Securing Services.

サービスによるセキュリティの指定The Service Specifies Security

WCF バインドでは、既定で、有効になっているセキュリティ機能があります。By default, WCF bindings have security features enabled. (BasicHttpBinding を除く)。したがって、サービスは、WCF を使用して作成されている場合は、認証、機密性、整合性を確実にセキュリティが実装される非常に高くなります。(The exception is the BasicHttpBinding.) Therefore, if the service was created using WCF, there is a greater chance that it will implement security to ensure authentication, confidentiality, and integrity. この場合、サービスが提供するメタデータによって、セキュリティで保護された通信チャネルの確立に必要なものが示されます。In that case, the metadata the service provides will indicate what it requires to establish a secure communication channel. サービス メタデータにセキュリティ要件がまったく含まれていない場合には、サービスでセキュリティ スキーム (SSL (Secure Sockets Layer) over HTTP など) を強制する方法はありません。If the service metadata does not include any security requirements, there is no way to impose a security scheme, such as Secure Sockets Layer (SSL) over HTTP, on a service. ただし、サービスがクライアントに資格情報の提供を求める場合は、クライアントの開発者、展開担当者、または管理者は、クライアントがサービスに対して認証を受けるときに実際に使用する資格情報を提供する必要があります。If, however, the service requires the client to supply a credential, then the client developer, deployer, or administrator must supply the actual credential that the client will use to authenticate itself to the service.

メタデータの取得Obtaining Metadata

クライアントを作成する場合、最初の手順はクライアントが通信を行うサービスからメタデータを取得することです。When creating a client, the first step is to obtain the metadata for the service that the client will communicate with. これは、次の 2 つの方法で行うことができます。This can be done in two ways. 最初に、サービスは metadata exchange (MEX) エンドポイントを公開または HTTP または HTTPS 経由でそのメタデータを使用できるように、ダウンロードできますを使用して、メタデータ、 ServiceModel メタデータ ユーティリティ ツール (Svcutil.exe)、両方を生成します。構成ファイルと同様に、クライアントは、コード ファイル。First, if the service publishes a metadata exchange (MEX) endpoint or makes its metadata available over HTTP or HTTPS, you can download the metadata using the ServiceModel Metadata Utility Tool (Svcutil.exe), which generates both code files for a client as well as a configuration file. (詳細については、ツールを使用して、次を参照してくださいにアクセスするサービスの WCF クライアントを使用して。)。サービスにより MEX エンドポイントが公開されておらず、かつ HTTP または HTTPS 上でメタデータが使用可能になっていない場合は、サービス作成者に連絡して、セキュリティ要件とメタデータについて記述したドキュメントを入手する必要があります。(For more information about using the tool, see Accessing Services Using a WCF Client.) If the service does not publish a MEX endpoint and also does not make its metadata available over HTTP or HTTPS, you must contact the service creator for documentation that describes the security requirements and the metadata.


メタデータが信頼されたソースのものであり、改ざんされていないことを確認することをお勧めします。It is recommended that the metadata come from a trusted source and that it not be tampered with. HTTP プロトコルを使用して取得したメタデータはクリア テキストで送信されるため、改ざんされるおそれがあります。Metadata retrieved using the HTTP protocol is sent in clear text and can be tampered with. サービスで HttpsGetEnabled プロパティおよび HttpsGetUrl プロパティを使用している場合は、サービス作成者から提供された URL で、HTTPS プロトコルを使用してデータをダウンロードします。If the service uses the HttpsGetEnabled and HttpsGetUrl properties, use the URL the service creator supplied to download the data using the HTTPS protocol.

セキュリティの検証Validating Security

メタデータのソースは、信頼されたソースと信頼関係のないソースの 2 つに大きく分けられます。Metadata sources can be divided into two broad categories: trust sources and untrusted sources. ソースを信頼しており、そのソースのセキュリティで保護された MEX エンドポイントからクライアント コードとその他のメタデータをダウンロードしている場合、何の懸念もなく、クライアントをビルドし、適切な資格情報を提供して実行できます。If you trust a source and have downloaded the client code and other metadata from that source's secure MEX endpoint, then you can build the client, supply it with the right credentials, and run it with no other concerns.

ただし、ほとんど未知のソースからクライアントとメタデータをダウンロードする場合は、コードで使用しているセキュリティ対策を検証する必要があります。However, if you elect to download a client and metadata from a source that you know little about, be sure to validate the security measures the code uses. たとえば、サービスにより (最低でも) 機密性と整合性とが要求されていない場合は、個人情報や財務情報を送信するクライアントを作成するようなことは絶対に避けてください。For example, you must not simply create a client that sends your personal or financial information to a service unless the service demands confidentiality and integrity (at the very least). この種の情報はサービスの所有者から見ることが可能なので、この種の情報の開示を行ってもよいと判断できる程度にはサービスの所有者を信頼できる必要があります。You should trust the owner of the service to the extent that you are willing to disclose such information because such information will be visible to him or her.

したがって、信頼できないソースから受け取ったコードとメタデータを使用する場合には、それがこちらの必要とするセキュリティ レベルを満たしていることを確認する必要があります。As a rule, therefore, when using code and metadata from an untrusted source, check the code and metadata to ensure that it meets the security level that you require.

クライアント資格情報の設定Setting a Client Credential

クライアントへの資格情報の設定には、次の 2 つの手順があります。Setting a client credential on a client consists of two steps:

  1. 確認、クライアント資格情報の種類サービスが必要です。Determine the client credential type the service requires. これは、2 つある方法のどちらかによって行います。This is accomplished by one of two methods. 1 つ目の方法として、サービス作成者からドキュメントを入手している場合は、このドキュメントにサービスが要求するクライアント資格情報の種類が示されています (クライアント資格情報の種類が指定されている場合)。First, if you have documentation from the service creator, it should specify the client credential type (if any) the service requires. 2 番目の方法は Svcutil.exe ツールによって作成された構成ファイルしかない場合で、個々のバインディングを調べることで必要な資格情報の種類を特定できます。Second, if you have only a configuration file generated by the Svcutil.exe tool, you can examine the individual bindings to determine what credential type is required.

  2. 実際のクライアント資格情報を指定します。Specify an actual client credential. 実際のクライアント資格情報と呼ばれる、クライアント資格情報の値型から区別するためにします。The actual client credential is called a client credential value to distinguish it from the type. たとえば、クライアント資格情報の種類として証明書が指定されている場合、サービスが信頼する証明機関によって発行された X.509 証明書を指定する必要があります。For example, if the client credential type specifies a certificate, you must supply an X.509 certificate that is issued by a certification authority the service trusts.

クライアント資格情報の種類の特定Determining the Client Credential Type

Svcutil.exe ツールによって生成されたファイル、確認の構成がある場合、 <バインド >セクションをどのようなクライアント資格情報の種類が必要です。If you have the configuration file the Svcutil.exe tool generated, examine the <bindings> section to determine what client credential type is required. このセクション内には、セキュリティ要件を指定するバインド要素があります。Within the section are binding elements that specify the security requirements. 具体的には、確認、<セキュリティ > の各バインド要素。Specifically, examine the <security> Element of each binding. この要素には mode 属性が含まれており、3 つの値のいずれか (MessageTransport、または TransportWithMessageCredential) に設定できます。That element includes the mode attribute, which you can set to one of three possible values (Message, Transport, or TransportWithMessageCredential). この属性の値によってモードが決定され、このモードによってどの子要素が有効なのかが決定されます。The value of the attribute determines the mode, and the mode determines which of the child elements is significant.

<security>要素はいずれかを含めることができます、<transport>または<message>要素、またはその両方です。The <security> element can contain either a <transport> or <message> element, or both. セキュリティ モードと一致する要素が有効な要素です。The significant element is the one that matches the security mode. たとえば、次のコードでは、セキュリティ モードを "Message"<message> 要素のクライアント資格情報の種類を "Certificate" に指定しています。For example, the following code specifies that the security mode is "Message", and the client credential type for the <message> element is "Certificate". この場合、<transport> 要素は無視できます。In this case, the <transport> element can be ignored. ただし、<message> 要素で X.509 証明書を提示する必要があることが指定されています。However, the <message> element specifies that an X.509 certificate must be supplied.

    <binding name="WSHttpBinding_ICalculator">  
       <security mode="Message">  
           <transport clientCredentialType="Windows"   
                      realm="" />  
           <message clientCredentialType="Certificate"   
                    establishSecurityContext="true" />  

次の例に示すように、clientCredentialType 属性が "Windows" に設定されている場合は、実際の資格情報の値を指定する必要はありません。Note that if the clientCredentialType attribute is set to "Windows", as shown in the following example, you do not need to supply an actual credential value. これは、Windows 統合セキュリティでは、クライアントを実行しているユーザーの実際の資格情報 (Kerberos トークン) が提供されるためです。This is because the Windows integrated security provides the actual credential (a Kerberos token) of the person who is running the client.

<security mode="Message">  
    <transport clientCredentialType="Windows "   
        realm="" />  

クライアント資格情報の値の設定Setting the Client Credential Value

クライアントが資格情報を提供する必要があると特定された場合は、クライアントを構成する適切なメソッドを使用します。If it is determined that the client must supply a credential, use the appropriate method to configure the client. たとえば、クライアント証明書を設定するには、SetCertificate メソッドを使用します。For example, to set a client certificate, use the SetCertificate method.

X.509 証明書は広く使用されている資格情報の形式です。A common form of credential is the X.509 certificate. 資格情報は次の 2 つの方法で提供できます。You can supply the credential in two ways:

  • クライアント コードで (SetCertificate メソッドを使用して) プログラミングする方法。By programming it in your client code (using the SetCertificate method).

追加することで、 <動作 >クライアントの構成ファイルのセクションを使用して、clientCredentials要素 (下記参照)。By adding a <behaviors> section of the configuration file for the client and using the clientCredentials element (shown below).

設定、 <clientCredentials > コード値Setting a <clientCredentials> Value in Code

設定する、 <clientCredentials >値コードでは、アクセスする必要があります、ClientCredentialsのプロパティ、ClientBase<TChannel>クラス。To set a <clientCredentials> value in code, you must access the ClientCredentials property of the ClientBase<TChannel> class. このプロパティは、次の表に示すように、各種の資格情報の種類にアクセスできる ClientCredentials オブジェクトを返します。The property returns a ClientCredentials object that allows access to various credential types, as shown in the following table.

ClientCredential プロパティClientCredential Property 説明Description メモNotes
ClientCertificate X509CertificateInitiatorClientCredential を返しますReturns an X509CertificateInitiatorClientCredential クライアントがサービスに対して自身を認証するために提供する X.509 証明書を表します。Represents an X.509 certificate provided by the client to authenticate itself to the service.
HttpDigest HttpDigestClientCredential を返しますReturns an HttpDigestClientCredential HTTP ダイジェスト資格情報を表します。Represents an HTTP digest credential. この資格情報は、ユーザー名とパスワードのハッシュです。The credential is a hash of the user name and password.
IssuedToken IssuedTokenClientCredential を返しますReturns an IssuedTokenClientCredential フェデレーション シナリオで通常使用される、セキュリティ トークン サービスによって発行されるカスタム セキュリティ トークンを表します。Represents a custom security token issued by a Security Token Service, commonly used in federation scenarios.
Peer PeerCredential を返しますReturns a PeerCredential Windows ドメインのピア メッシュに参加するためのピア資格情報を表します。Represents a Peer credential for participation in a Peer mesh on a Windows domain.
ServiceCertificate X509CertificateRecipientClientCredential を返しますReturns an X509CertificateRecipientClientCredential 帯域外ネゴシエーションでサービスによって提供される X.509 証明書を表します。Represents an X.509 certificate provided by the service in an out-of-band negotiation.
UserName UserNamePasswordClientCredential を返しますReturns a UserNamePasswordClientCredential ユーザー名とパスワードのペアを表します。Represents a user name and password pair.
Windows WindowsClientCredential を返しますReturns a WindowsClientCredential Windows クライアントの資格情報 (Kerberos 資格情報) を表します。Represents a Windows client credential (a Kerberos credential). このクラスのプロパティは読み取り専用です。The properties of the class are read-only.

設定、 <clientCredentials > 構成内の値Setting a <clientCredentials> Value in Configuration

子要素として、エンドポイントの動作を使用して、資格情報の値が指定されて、 <clientCredentials >要素。Credential values are specified by using an endpoint behavior as child elements of the <clientCredentials> element. 使用される要素は、クライアントの資格情報の種類によって異なります。The element used depends on the client credential type. たとえば、次の例は、X.509 証明書を使用して設定を構成を示しています。、<<clientCertificate >します。For example, the following example shows the configuration to set an X.509 certificate using the <<clientCertificate>.

        <behavior name="myEndpointBehavior">  
            <clientCertificate findvalue="myMachineName"   
            storeLocation="Current" X509FindType="FindBySubjectName" />  

構成でクライアント資格情報を設定するには追加、 <endpointBehaviors >要素を構成ファイル。To set the client credential in configuration, add an <endpointBehaviors> element to the configuration file. さらに、追加した動作要素は、サービスのエンドポイントにリンクする必要がありますを使用して、behaviorConfigurationの属性、 <エンドポイント > の<クライアント >要素の次の例に示すようにします。Additionally, the added behavior element must be linked to the service's endpoint using the behaviorConfiguration attribute of the <endpoint> of <client> element as shown in the following example. behaviorConfiguration 属性の値は、動作の name 属性の値と一致する必要があります。The value of the behaviorConfiguration attribute must match the value of the behavior name attribute.

      <endpoint address="http://localhost/servicemodelsamples/service.svc"
                contract="Microsoft.ServiceModel.Samples.ICalculator" />


クライアント資格情報の値の中には、アプリケーション構成ファイルを使用して設定できないものがあります (ユーザー名とパスワードや、Windows ユーザーとパスワードの値など)。Some of the client credential values cannot be set using application configuration files, for example, user name and password, or Windows user and password values. このような資格情報の値は、コードでのみ指定できます。Such credential values can be specified only in code.

クライアント資格情報を設定する方法についての詳細については、次を参照してください。方法。クライアント資格情報の値を指定します。For more information about setting the client credential, see How to: Specify Client Credential Values.


次の構成例に示すように、ClientCredentialTypeSecurityMode に設定されている場合、"TransportWithMessageCredential", は無視されます。ClientCredentialType is ignored when SecurityMode is set to "TransportWithMessageCredential", as shown in the following sample configuration.

    <binding name="PingBinding">  
        <security mode="TransportWithMessageCredential"  >  
           <message  clientCredentialType="UserName"   
               negotiateServiceCredential="false" />  
           <transport clientCredentialType="Certificate"  />  

関連項目See also