方法 : カスタム トークンを作成する
ここでは、SecurityToken を使用してカスタムのセキュリティ トークンを作成する方法と、作成したトークンを、カスタム セキュリティ トークン プロバイダおよび認証システムと統合する方法について説明します。
"セキュリティ トークン" とは、基本的に、Windows Communication Foundation (WCF) セキュリティ フレームワークが SOAP メッセージ内の送信者に関するクレームを表すために使用する XML 要素です。WCF セキュリティは、システム指定の認証モードで使用するさまざまなトークンを提供します**。たとえば、X509SecurityToken クラスによって表される X.509 証明書セキュリティ トークンや、UserNameSecurityToken クラスによって表されるユーザー名セキュリティ トークンなどがあります。
認証モードや資格情報は、指定した種類のトークンではサポートされないことがあります。そのような場合は、SOAP メッセージ内部のカスタム資格情報の XML 表現を提供するカスタム セキュリティ トークンを作成する必要があります。
以下の手順は、カスタム セキュリティ トークンの作成方法と、これを WCF セキュリティ インフラストラクチャに統合する方法を示しています。ここでは、クライアントのクレジット カードに関する情報をサーバーに渡す際に使用するクレジット カード トークンを作成します。
カスタム資格情報とセキュリティ トークン マネージャ詳細については、 、「方法 : カスタム クライアントおよびサービスの資格情報を作成する」を参照してください。
セキュリティ トークンを表すさまざまなクラスについては、「System.IdentityModel.Tokens 名前空間」を参照してください。
資格情報、セキュリティ トークン マネージャ、およびプロバイダ クラスと認証システム クラス詳細については、 、「セキュリティ アーキテクチャ」を参照してください。
手順
クライアント アプリケーションには、セキュリティ インフラストラクチャにクレジット カード情報を指定する方法を設ける必要があります。この情報は、カスタムのクライアント資格情報クラスによりアプリケーションに提供されます。最初に、カスタム クライアント資格情報のクレジット カード情報を表すクラスを作成します。
クライアント資格情報内のクレジット カード情報を表すクラスを作成するには
クレジット カード情報を表す新しいクラスをアプリケーションに定義します。次の例は、
CreditCardInfo
クラスを示しています。適切なプロパティをクラスに追加し、カスタム トークンに必要な情報をアプリケーションで設定できるようにします。次の例では、
CardNumber
、CardIssuer
、およびExpirationDate
の 3 つのプロパティをクラスに割り当てます。
次に、カスタム セキュリティ トークンを表すクラスを作成する必要があります。このクラスは、セキュリティ トークン プロバイダ、認証システム、およびシリアライザの各クラスが、WCF セキュリティ インフラストラクチャとの間で、セキュリティ トークンに関する情報を受け渡しする際に使用します。
カスタム セキュリティ トークン クラスを作成するには
SecurityToken クラスから派生する新しいクラスを定義します。
CreditCardToken
という名前のクラスを作成する例を次に示します。Id プロパティをオーバーライドします。このプロパティを使用して、SOAP メッセージ内の他の要素からセキュリティ トークンの XML 表現をポイントするためのセキュリティ トークンのローカル識別子を取得します。次の例では、トークン識別子をコンストラクタ パラメータとしてこのプロパティに渡すことも、セキュリティ トークン インスタンスを作成するたびに新しいランダムな識別子を生成することもできます。
SecurityKeys プロパティを実装します。このプロパティは、セキュリティ トークン インスタンスが表すセキュリティ キーのコレクションを返します。これらのキーを使用して、WCF は、SOAP メッセージの一部に署名したり、暗号化したりできます。次の例では、クレジット カード セキュリティ トークンにはセキュリティ キーを含めることができません。そのため、実装は、常に空のコレクションを返します。
ValidFrom プロパティと ValidTo プロパティをオーバーライドします。これらのプロパティを使用して、WCF は、セキュリティ トークン インスタンスの有効性を判別します。次の例では、クレジット カード セキュリティ トークンに有効期限のみが含まれているため、
ValidFrom
プロパティは、インスタンスの作成日時を表す DateTime を返します。
セキュリティ トークンの新しい種類を作成したときは、SecurityTokenParameters クラスの実装が必要です。この実装をセキュリティ バインディング要素構成で使用して、新しいトークンの種類を表します。セキュリティ トークンのパラメータ クラスは、メッセージを処理するときに実際のセキュリティ トークン インスタンスを一致させるためのテンプレートとして使用できます。このテンプレートは、セキュリティ トークンを使用したり、認証したりする際に適合する必要がある条件を指定するためにアプリケーションで使用できる追加のプロパティを提供します。次の例では、追加のプロパティを指定しないため、使用または検証するセキュリティ トークン インスタンスを WCF インフラストラクチャが検索するときに、該当するセキュリティ トークンの種類だけが一致項目になります。
カスタム セキュリティ トークン パラメータ クラスを作成するには
SecurityTokenParameters クラスから派生する新しいクラスを定義します。
CloneCore メソッドを実装します。クラスで内部フィールドが定義されている場合は、それらをすべてコピーします。次の例では、追加のフィールドを定義しません。
SupportsClientAuthentication の読み取り専用プロパティを実装します。このクラスで表されているセキュリティ トークンの種類を使用して、サービスに対するクライアントの認証が可能な場合、このプロパティは
true
を返します。次の例では、クレジット カード セキュリティ トークンを使用して、サービスに対するクライアントの認証を行うことができます。SupportsServerAuthentication の読み取り専用プロパティを実装します。このクラスで表されているセキュリティ トークンの種類を使用して、クライアントに対するサービスの認証が可能な場合、このプロパティは
true
を返します。次の例では、クレジット カード セキュリティ トークンを使用して、クライアントに対するサービスの認証を行うことができません。SupportsClientWindowsIdentity の読み取り専用プロパティを実装します。このクラスで表されているセキュリティ トークンの種類を Windows アカウントに割り当てることができる場合、このプロパティは
true
を返します。その場合、認証結果が WindowsIdentity クラス インスタンスによって表されます。次の例では、Windows アカウントにトークンを割り当てることができません。CreateKeyIdentifierClause メソッドを実装します。このメソッドは、セキュリティ トークン パラメータ クラスによって表されるセキュリティ トークン インスタンスへの参照が必要なときに WCF セキュリティ フレームワークによって呼び出されます。このメソッドには、実際のセキュリティ トークン インスタンスと、要求されている参照の型を指定する SecurityTokenReferenceStyle の両方が引数として渡されます。次の例では、内部参照だけがクレジット カード セキュリティ トークンでサポートされます。SecurityToken クラスは、内部参照を作成する機能を備えているため、実装には追加のコードが必要ありません。
InitializeSecurityTokenRequirement メソッドを実装します。WCF は、このメソッドを呼び出して、セキュリティ トークン パラメータ クラス インスタンスを SecurityTokenRequirement クラスのインスタンスに変換します。変換結果は、適切なセキュリティ トークン インスタンスを作成するためにセキュリティ トークン プロバイダによって使用されます。
セキュリティ トークンは、SOAP メッセージ内で送信されますが、そのためには、セキュリティ トークンのインメモリ表現とネットワーク上表現の間での変換機構が必要です。WCF では、セキュリティ トークン シリアライザを使用してこのタスクを実行します。すべてのカスタム トークンには、カスタム セキュリティ トークンを SOAP メッセージからシリアル化および逆シリアル化できるカスタム セキュリティ トークン シリアライザを関連付ける必要があります。
![]() |
---|
派生キーは、既定で有効になっています。カスタム セキュリティ トークンを作成し、プライマリ トークンとして使用する場合、WCF では、そのトークンからキーが派生します。キーを派生する一方、カスタム セキュリティ トークン シリアライザが呼び出され、DerivedKeyToken をシリアル化しながら、そのカスタム セキュリティ トークンの SecurityKeyIdentifierClause をネットワークに送出します。受信側では、ネットワーク外でのトークンの逆シリアル化時に、DerivedKeyToken シリアライザは、トークンのすぐ下のトップレベルの子として SecurityTokenReference 要素を必要とします。カスタム セキュリティ トークン シリアライザによる句型のシリアル化時に SecurityTokenReference 要素が追加されていなかった場合、例外がスローされます。 |
カスタム セキュリティ トークン シリアライザを作成するには
WSSecurityTokenSerializer クラスから派生する新しいクラスを定義します。
XmlReader に基づいて XML ストリームを読み取る CanReadTokenCore メソッドをオーバーライドします。シリアライザ実装が現在の要素に基づいてセキュリティ トークンを逆シリアル化できる場合、このメソッドは
true
を返します。次の例では、このメソッドが、XML リーダーの現在の XML 要素が正しい要素名と名前空間を持っているかどうかをチェックします。持っていない場合は、このメソッドの基本クラスの実装を呼び出して、XML 要素を処理します。ReadTokenCore メソッドをオーバーライドします。このメソッドは、セキュリティ トークンの XML コンテンツを読み取り、その適切なメモリ内表現を構築します。渡された XML リーダーの基盤となる XML 要素を認識できない場合は、基本クラスの実装を呼び出して、システム指定のトークンの種類を処理します。
CanWriteTokenCore メソッドをオーバーライドします。引数として渡されるトークンのメモリ内表現を XML 表現に変換できる場合、このメソッドは
true
を返します。変換できない場合は、基本クラスの実装を呼び出します。WriteTokenCore メソッドをオーバーライドします。このメソッドは、セキュリティ トークンのメモリ内表現を XML 表現に変換します。変換できない場合は、基本クラスの実装を呼び出します。
上記の 4 つの手順を完了したら、カスタム セキュリティ トークンをセキュリティ トークン プロバイダ、セキュリティ トークン認証システム、セキュリティ トークン マネージャ、クライアント資格情報、およびサービス資格情報と統合します。
カスタム セキュリティ トークンをセキュリティ トークン プロバイダと統合するには
- セキュリティ トークン プロバイダは、必要に応じて、トークンのインスタンスを作成、変更、および返却します。カスタム セキュリティ トークンのカスタム プロバイダを作成するには、SecurityTokenProvider クラスを継承するクラスを作成します。GetTokenCore メソッドをオーバーライドして、
CreditCardToken
のインスタンスを返す例を次に示します。カスタム セキュリティ トークン プロバイダ詳細については、 、「方法 : カスタム セキュリティ トークン プロバイダを作成する」を参照してください。
カスタム セキュリティ トークンをセキュリティ トークン認証システムと統合するには
- セキュリティ トークン認証システムは、セキュリティ トークンがメッセージから抽出されたときにトークンの内容を検証します。カスタム セキュリティ トークンのカスタム認証システムを作成するには、SecurityTokenAuthenticator クラスを継承するクラスを作成します。ValidateTokenCore メソッドをオーバーライドする例を次に示します。カスタム セキュリティ トークン認証システム詳細については、 、「方法 : カスタム セキュリティ トークン認証システムを作成する」を参照してください。
カスタム セキュリティ トークンをセキュリティ トークン マネージャと統合するには
- セキュリティ トークン マネージャは、トークン プロバイダ、セキュリティ認証システム、およびトークン シリアライザの適切なインスタンスを作成します。カスタム トークン マネージャを作成するには、ClientCredentialsSecurityTokenManager クラスを継承するクラスを作成します。このクラスの主要なメソッドは SecurityTokenRequirement を使用して、適切なプロバイダとクライアント資格情報またはサービス資格情報を作成します。カスタム セキュリティ トークン マネージャ詳細については、 、「方法 : カスタム クライアントおよびサービスの資格情報を作成する」を参照してください。
カスタム セキュリティ トークンをカスタムのクライアント資格情報およびサービス資格情報と統合するには
- アプリケーションに API を提供し、事前に作成したカスタム セキュリティ トークン インフラストラクチャで、カスタム セキュリティ トークンの内容を提供および認証する際に使用するカスタム トークン情報を指定できるようにするには、カスタムのクライアント資格情報とサービス資格情報を追加する必要があります。この方法を次の例に示します。カスタムのクライアント資格情報とサービス資格情報詳細については、 、「方法 : カスタム クライアントおよびサービスの資格情報を作成する」を参照してください。
事前に作成したカスタム セキュリティ トークン パラメータ クラスを使用して、サービスとの通信時にカスタム セキュリティ トークンを使用する必要があることを WCF セキュリティ フレームワークに伝えます。この方法を次の手順に示します。
カスタム セキュリティ トークンをバインディングと統合するには
- SecurityBindingElement クラスで公開されるトークン パラメータ コレクションの 1 つで、カスタム セキュリティ トークン パラメータ クラスを指定する必要があります。次の例では、SignedEncrypted によって返されるコレクションを使用します。このコードでは、クライアントからサービスに送信されるすべてのメッセージにクレジット カードのカスタム トークンを追加し、メッセージの内容に自動的に署名して暗号化します。
関連項目
タスク
方法 : カスタム セキュリティ トークン プロバイダを作成する
リファレンス
SecurityToken
SecurityTokenParameters
WSSecurityTokenSerializer
SecurityTokenProvider
SecurityTokenAuthenticator
IAuthorizationPolicy
SecurityTokenRequirement
SecurityTokenManager
ClientCredentials
ServiceCredentials
SecurityBindingElement
概念
方法 : カスタム クライアントおよびサービスの資格情報を作成する
方法 : カスタム セキュリティ トークン認証システムを作成する
セキュリティ アーキテクチャ