方法 : サービスで使用するカスタム承認マネージャを作成する
Windows Communication Foundation (WCF) 内の識別モデル インフラストラクチャでは、拡張性のあるクレーム ベースの承認モデルがサポートされます。クレームはトークンから抽出され、状況に応じてカスタム承認ポリシーによって処理されてから、AuthorizationContext に格納されます。承認マネージャは、AuthorizationContext 内のクレームを検査して承認に関する決定を行います。
既定では、承認に関する決定は、ServiceAuthorizationManager クラスによって行われますが、カスタム承認マネージャを作成することによってオーバーライドできます。カスタム承認マネージャを作成するには、ServiceAuthorizationManager から派生するクラスを作成し、CheckAccessCore メソッドを実装します。承認に関する決定は、CheckAccessCore メソッド内で行われます。このメソッドは、アクセスが許可されている場合は true を返し、拒否されている場合は false を返します。
承認決定がメッセージ本文の内容に依存する場合は、CheckAccess メソッドを使用します。
パフォーマンスの問題があるので、可能であればアプリケーションを再デザインして、承認決定でメッセージ本文にアクセスする必要がないようにしてください。
サービスのカスタム承認マネージャは、コードまたは構成に登録できます。
カスタム承認マネージャを作成するには
ServiceAuthorizationManager クラスからクラスを派生させます。
CheckAccessCore メソッドをオーバーライドします。
CheckAccessCore メソッドに渡される OperationContext を使用して、承認に関する決定を行います。
承認に関する決定を行うために、FindClaims メソッドを使用してカスタム クレーム
https://www.contoso.com/claims/allowedoperation
を検索する方法を次のコード例に示します。
コードを使用してカスタム承認マネージャを登録するには
カスタム承認マネージャのインスタンスを作成し、これを ServiceAuthorizationManager プロパティに割り当てます。
ServiceAuthorizationBehavior には、Authorization プロパティを使用してアクセスできます。
MyServiceAuthorizationManager
カスタム承認マネージャを登録するコード例を次に示します。
構成を使用してカスタム承認マネージャを登録するには
サービスの構成ファイルを開きます。
Behaviors elementに serviceAuthorization elementを追加します。
serviceAuthorization elementに serviceAuthorizationManagerType 属性を追加し、この属性の値をカスタム承認マネージャを表す型に設定します。
クライアントとサービスの間の通信をセキュリティで保護するバインディングを追加します。
この通信用に選択されたバインディングによって、AuthorizationContext に追加されるクレームが決まります。これは、カスタム承認マネージャが承認に関する決定を行うために使用します。システム指定のバインディングの詳細については、「システム標準のバインディング」を参照してください。
<service> 要素を追加し、behaviorConfiguration 属性の値を <behavior> of <serviceBehaviors> 要素の名前属性の値に設定して、サービス エンドポイントに動作を関連付けます。
サービス エンドポイントの構成の詳細については、「方法 : 構成にサービス エンドポイントを作成する」を参照してください。
カスタム承認マネージャ
Samples.MyServiceAuthorizationManager
を登録するコード例を次に示します。<configuration> <system.serviceModel> <services> <service name="Microsoft.ServiceModel.Samples.CalculatorService" behaviorConfiguration="CalculatorServiceBehavior"> <host> <baseAddresses> <add baseAddress="https://localhost:8000/ServiceModelSamples/service"/> </baseAddresses> </host> <endpoint address="" binding="wsHttpBinding_Calculator" contract="Microsoft.ServiceModel.Samples.ICalculator" /> </service> </services> <bindings> <WSHttpBinding> <binding name = "wsHttpBinding_Calculator"> <security mode="Message"> <message clientCredentialType="Windows"/> </security> </binding> </WSHttpBinding> </bindings> <behaviors> <serviceBehaviors> <behavior name="CalculatorServiceBehavior"> <serviceAuthorization serviceAuthorizationManagerType="Samples.MyServiceAuthorizationManager" /> </behaviors> </serviceBehaviors> </behaviors> </system.serviceModel> </configuration>
例
CheckAccessCore メソッドのオーバーライドを含む ServiceAuthorizationManager クラスの基本実装を次のコード例に示します。このコード例は、AuthorizationContext のカスタム クレームを調べ、そのカスタム クレームのリソースが OperationContext のアクション値と一致した場合に true を返します。ServiceAuthorizationManager クラスのより完全な実装については、「Authorization Policy Sample」を参照してください。