これを処理する 1 つの方法は、3 つのオブジェクトを作成することです。
- リクエスト/レスポンスの分析を担当するメッセージインスペクタ
- サービスの動作により、インスペクターがパイプラインに自動的に挿入されます
- 構成セクションでは、動作を web.config で使用できます。
まず、IDispatchMessageInspector を実装し、検証コードを AfterReceiveRequest メソッドに配置して、メッセージ インスペクターを作成します。
public class HmacVerificationInspector : IDispatchMessageInspector
{
#region IDispatchMessageInspector Members
public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request,
System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)
{
MessageBuffer buffer = request.CreateBufferedCopy(Int32.MaxValue);
request = buffer.CreateMessage();
Message dupeRequest = buffer.CreateMessage();
ValidateHmac(dupeRequest);
buffer.Close();
return null;
}
public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply,
object correlationState)
{
}
#endregion
}
メッセージを読むときは、メッセージのバッファリングされたコピーを作成することが重要です。メッセージは 1 回しか開くことができず、コピーを作成しないとパイプの下で問題が発生します。私の ValidateHmac の実装は、失敗すると例外をスローします。これにより、実際のサービスが呼び出されなくなります。
次に、インスペクタの動作を作成します。この動作を使用して、インスペクターを WCF ランタイムに挿入します。動作を作成するには、IEndpointBehavior からクラスを派生させて、次のようにします。
public class HmacVerificationBehavior : IEndpointBehavior
{
#region IEndpointBehavior Members
public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime)
{
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher)
{
HmacVerificationInspector inspector = new HmacVerificationInspector();
endpointDispatcher.DispatchRuntime.MessageInspectors.Add(inspector);
}
public void Validate(ServiceEndpoint endpoint)
{
}
#endregion
}
インスペクター ( HmacVerificationInspector
) の新しいインスタンスを作成し、それをプログラムでランタイムに挿入していることに注意してください。
最後に、構成セクションを作成します。これを使用して、Web 構成で動作を適用できます (したがって、構成を介してオンとオフを切り替えることができます)。新しいクラスを作成し、BehaviorExtensionElement と IServiceBehavior から継承します。
public class HmacVerificationConfigurationSection : BehaviorExtensionElement, IServiceBehavior
{
#region IServiceBehavior Members
public void AddBindingParameters(ServiceDescription serviceDescription,
System.ServiceModel.ServiceHostBase serviceHostBase,
System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints,
System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
{
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase)
{
}
public void Validate(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase)
{
}
#endregion
public override Type BehaviorType
{
get { return typeof(HmacVerificationBehavior); }
}
protected override object CreateBehavior()
{
return new HmacVerificationBehavior();
}
}
ここで、インスペクターを使用するには、web.config に以下を追加します (拡張機能の名前は任意に設定できます)。
<system.serviceModel>
<extensions>
<behaviorExtensions>
<add name="hmacVerification" type="NamespaceHere.HmacVerificationConfigurationSection, AssembleyHere, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</behaviorExtensions>
</extensions>
<services>
<service name="MySecureService">
<endpoint address="" binding="webHttpBinding" contract="IMySecureService" behaviorConfiguration="web" />
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="web">
<webHttp automaticFormatSelectionEnabled="true" />
<hmacVerification />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
</system.serviceModel>
まず、構成セクションを動作拡張に登録します。次に、その構成をエンドポイントの動作として使用します。これにより、インスペクターが自動的に挿入され、そのエンドポイントへのすべてのリクエストがインスペクターを介して実行されます。インスペクターをオフにする場合は、タグを削除するか、別のエンドポイント動作を選択してください。webHttp 動作の使用にも注意してください (これにより、automaticFormatSelectionEnabled.
お役に立てれば