私は WCF サービスと、基本的な poco アイテムの配列を返すいくつかの操作を行っています。
クライアントがアクセスできないアイテムを誤って返すケースを軽減するために、IParameterInspector を使用し、それを IOperationBehavior 属性にアタッチしてから、AfterCall で読み取りアクセスを検証することを計画していました。クライアントに読み取り権限がない場合は、WebFaultException をスローします。
アイテム リポジトリ (サービス クラス) でカスタム認証を使用していますが、IParameterInspector.AfterCall を入力すると ServiceSecurityContext が null になるため、それを使用して、クライアントが認証されてアイテムを読み取るかどうかを確認できません。
私の質問は、IParameterInspector.AfterCall メソッドでサービス インスタンス (PerCall) にアクセスするにはどうすればよいですか?
また、Invoke メソッドで実際の認証を行う IOperationInvoker も使用しています (どのユーザーか、匿名かを確認します)。
そして、AfterCall の「出力」と「returnValue」の違いは何ですか?
public class ParameterInspector : IParameterInspector
{
public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState)
{
var items = returnValue as Item[];
if (items == null) return;
foreach (var item in items)
{
User user = ?
// Throw if no access
}
}
public object BeforeCall(string operationName, object[] inputs)
{
return inputs;
}
}
public class AuthenticationOperationInvoker : IOperationInvoker
{
public object Invoke(object instance, object[] inputs, out object[] outputs)
{
var repo = instance as RepositoryBase;
User user;
repo.Authenticate(out user);
return _defaultInvoker.Invoke(instance, inputs, out outputs);
}
}