方法 : カスタム クライアントおよびサービスの資格情報を作成する
このトピックでは、クライアントおよびサービスにカスタム資格情報を実装する方法と、これをアプリケーション コードから使用する方法について説明します。
資格情報拡張クラス
ClientCredentials クラスおよび ServiceCredentials クラスは、Windows Communication Foundation (WCF) セキュリティ拡張のメイン エントリ ポイントです。これらの資格情報クラスでは、アプリケーション コードから資格情報を設定し、資格情報の種類をセキュリティ トークンに変換する API を提供します (("セキュリティ トークン" とは、SOAP メッセージ内の資格情報を送信するために使用される形式です**)。これらの資格情報クラスの役割は、次の 2 つの領域に分けることができます。
- アプリケーションで資格情報を設定するための API を提供します。
- SecurityTokenManager 実装のファクトリとして動作します。
ClientCredentials クラスと ServiceCredentials クラスは、どちらも SecurityTokenManager を返すためのコントラクトを定義する SecurityCredentialsManager 抽象クラスから継承されます。
資格情報クラス、およびこれらのクラスが WCF のセキュリティ アーキテクチャに組み込まれるしくみの詳細については、「セキュリティ アーキテクチャ」を参照してください。
WCF で提供される既定の実装では、システム指定の資格情報の種類をサポートし、これらの資格情報の種類を処理できるセキュリティ トークン マネージャを作成します。
カスタマイズする理由
クライアントまたはサービスの資格情報クラスをカスタマイズする場合、いくつかの理由があります。最大の理由として、システム指定の資格情報の種類の処理について、特に以下の必要性が生じたために WCF の既定のセキュリティ動作を変更する必要があることが挙げられます。
- 他の拡張ポイントを使用した場合には不可能な変更の必要性
- 新しい資格情報の種類を追加する必要性
- 新しいカスタム セキュリティ トークンの種類を追加する必要性
このトピックでは、カスタムのクライアント資格情報およびサービス資格情報を実装する方法と、これをアプリケーション コードから使用する方法について説明します。
最初の手順
資格情報をカスタマイズする理由は、資格情報の準備、セキュリティ トークンのシリアル化、または認証に関する WCF の動作を変更することにあるため、カスタム資格情報クラスの作成は最初の手順にすぎません。このセクションの他のトピックでは、カスタムのシリアライザと認証システムを作成する方法について説明します。カスタム資格情報クラスの作成は、このような観点からすると、一連のトピックの最初の手順になります。これに続く処理 (カスタムのシリアライザおよび認証システムの作成) は、カスタム資格情報の作成後にのみ可能になります。このトピックに基づく他のトピックには、次のものがあります。
手順
カスタム クライアント資格情報の実装
ClientCredentials クラスから派生する新しいクラスを定義します。
省略可能。新しい資格情報の種類にメソッドまたはプロパティを提供するために、新しいプロパティを追加します。新しい資格情報の種類を追加しない場合は、この手順を省略します。次の例では、
CreditCardNumber
プロパティを追加します。CreateSecurityTokenManager メソッドをオーバーライドします。カスタム クライアント資格情報が使用されると、WCF セキュリティ インフラストラクチャによってこのメソッドが自動的に呼び出されます。このメソッドは、SecurityTokenManager クラスの実装のインスタンスを作成して返す役割を担います。次の手順では、このような実装を作成する方法を示します。
CloneCore メソッドをオーバーライドします。
カスタム クライアント セキュリティ トークン マネージャの実装
ClientCredentialsSecurityTokenManager から派生する新しいクラスを定義します。
省略可能。カスタム SecurityTokenProvider 実装を作成する必要がある場合は、CreateSecurityTokenProvider メソッドをオーバーライドします。カスタム セキュリティ トークン プロバイダの詳細については、「方法 : カスタム セキュリティ トークン プロバイダを作成する」を参照してください。
省略可能。カスタム SecurityTokenAuthenticator 実装を作成する必要がある場合は、CreateSecurityTokenAuthenticator メソッドをオーバーライドします。カスタム セキュリティ トークン認証システムの詳細については、「方法 : カスタム セキュリティ トークン認証システムを作成する」を参照してください。
省略可能。カスタム SecurityTokenSerializer を作成する必要がある場合は、CreateSecurityTokenSerializer メソッドをオーバーライドします。カスタム セキュリティ トークンおよびカスタム セキュリティ トークン シリアライザの詳細については、「方法 : カスタム トークンを作成する」を参照してください。
アプリケーション コードによるカスタム クライアント資格情報の使用
サービス インターフェイスを表す、生成されたクライアントのインスタンスを作成するか、または通信の対象となるサービスを指す ChannelFactory のインスタンスを作成します。
Behaviors コレクションから、システム指定のクライアント資格情報の動作を削除します。このコレクションには、Endpoint プロパティからアクセスできます。
カスタム資格情報クラスの新しいインスタンスを作成し、Behaviors コレクションに追加します。このコレクションには、Endpoint プロパティからアクセスできます。
上記の手順は、アプリケーション コードからクライアント資格情報を使用する方法を示しています。WCF の資格情報は、アプリケーション構成ファイルを使用して構成することもできます。ソースの変更、再コンパイル、再展開を行うことなくアプリケーションのパラメータを変更できるため、ハードコーディングを行うよりもアプリケーション構成ファイルの使用を一般にお勧めします。
次の手順では、カスタム資格情報の構成をサポートする方法について説明します。
カスタム クライアント資格情報の構成ハンドラの作成
ClientCredentialsElement から派生する新しいクラスを定義します。
省略可能。アプリケーション構成を通じて公開する必要があるすべての追加構成パラメータのプロパティを追加します。次の例では、
CreditCardNumber
という名前のプロパティを追加します。BehaviorType プロパティをオーバーライドして、構成要素によって作成されたカスタム クライアント資格情報クラスの型を返します。
CreateBehavior メソッドをオーバーライドします。このメソッドは、構成ファイルから読み込まれた設定に基づいてカスタム資格情報クラスのインスタンスを作成して返す役割を担います。このメソッドから ApplyConfiguration 基本メソッドを呼び出し、カスタム クライアント資格情報インスタンスに読み込まれたシステム指定の資格情報の設定を取得します。
省略可能。手順 2. で追加のプロパティを追加している場合は、Properties プロパティをオーバーライドして、追加した構成設定が構成フレームワークから認識されるよう登録します。追加したプロパティを基本クラスのプロパティと結合して、このカスタム クライアント資格情報の構成要素を通じてシステム指定の設定が構成されるようにします。
構成ハンドラ クラスを作成したら、WCF の構成フレームワークに統合できます。これにより、次の手順で示すように、カスタム クライアント資格情報をクライアント エンドポイント動作要素で使用できるようになります。
カスタム クライアント資格情報構成ハンドラのアプリケーション構成への登録と使用
<extensions> 要素、および <behaviorExtensions> 要素を構成ファイルに追加します。
<add> 要素を <behaviorExtensions> 要素に追加し、name 属性を適切な値に設定します。
type 属性を完全修飾型名に設定します。また、アセンブリ名と他のアセンブリ属性を含めます。
<system.serviceModel> <extensions> <behaviorExtensions> <add name="myClientCredentials" type="Microsoft.ServiceModel.Samples.MyClientCredentialsConfigHandler, CustomCredentials, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> </behaviorExtensions> </extensions> <system.serviceModel>
構成ハンドラの登録後は、システム指定の <clientCredentials> 要素の代わりに、同じ構成ファイル内でカスタム資格情報要素を使用できます。システム指定のプロパティと、構成ハンドラの実装に追加した任意の新規プロパティのどちらも使用できます。次の例では、creditCardNumber 属性を使用して、カスタム プロパティの値を設定します。
<behaviors> <endpointBehaviors> <behavior name="myClientCredentialsBehavior"> <myClientCredentials creditCardNumber="123-123-123"/> </behavior> </endpointBehaviors> </behaviors>
カスタム サービス資格情報の実装
ServiceCredentials から派生する新しいクラスを定義します。
省略可能。追加している新しい資格情報の値に API を提供するために新しいプロパティを追加します。新しい資格情報の値を追加しない場合は、この手順を省略します。次の例では、
AdditionalCertificate
プロパティを追加します。CreateSecurityTokenManager メソッドをオーバーライドします。カスタム クライアント資格情報が使用されると、WCF インフラストラクチャによって、このメソッドが自動的に呼び出されます。このメソッドは、SecurityTokenManager クラスの実装のインスタンスを作成して返す役割を担います (次の手順で説明)。
省略可能。CloneCore メソッドをオーバーライドします。この手順は、カスタム クライアント資格情報の実装に新しいプロパティまたは内部フィールドを追加する場合にのみ必要になります。
カスタム サービス セキュリティ トークン マネージャの実装
ServiceCredentialsSecurityTokenManager クラスから派生する新しいクラスを定義します。
省略可能。カスタム SecurityTokenProvider 実装を作成する必要がある場合は、CreateSecurityTokenProvider メソッドをオーバーライドします。カスタム セキュリティ トークン プロバイダの詳細については、「方法 : カスタム セキュリティ トークン プロバイダを作成する」を参照してください。
省略可能。カスタム SecurityTokenAuthenticator 実装を作成する必要がある場合は、CreateSecurityTokenAuthenticator メソッドをオーバーライドします。カスタム セキュリティ トークン認証システムの詳細については、「方法 : カスタム セキュリティ トークン認証システムを作成する」を参照してください。
省略可能。カスタム SecurityTokenSerializer を作成する必要がある場合は、CreateSecurityTokenSerializer メソッドをオーバーライドします。カスタム セキュリティ トークンおよびカスタム セキュリティ トークン シリアライザの詳細については、「方法 : カスタム トークンを作成する」を参照してください。
アプリケーション コードによるカスタム サービス資格情報の使用
ServiceHost のインスタンスを作成します。
Behaviors コレクションから、システム指定のサービス資格情報の動作を削除します。
カスタム サービス資格情報クラスの新しいインスタンスを作成し、これを Behaviors コレクションに追加します。
前の「Creating a configuration handler for custom client credentials」および「Registering and using a custom client credentials configuration handler in the application configuration」で説明した手順を使用して構成にサポートを追加します。構成ハンドラの基本クラスとして、ClientCredentialsElement クラスではなく ServiceCredentialsElement クラスを使用する点のみが異なります。カスタム サービス資格情報要素は、システム指定の <serviceCredentials>
要素を使用する場合にいつでも使用できます。
関連項目
タスク
方法 : カスタム セキュリティ トークン プロバイダを作成する
リファレンス
ClientCredentials
ServiceCredentials
SecurityCredentialsManager
SecurityTokenManager
ClientCredentialsElement
ServiceCredentialsElement