我有一个 WCF 服务和几个操作,我返回基本 poco 项目的数组。
为了减轻我错误地返回客户端无权访问的项目的情况,我计划使用 IParameterInspector,将其附加到 IOperationBehavior 属性,然后在 AfterCall 中验证读取访问权限。如果客户端没有读取权限,那么我会抛出 WebFaultException。
我在我的项目存储库(服务类)上使用自定义身份验证,当我输入 IParameterInspector.AfterCall 时 ServiceSecurityContext 为空,因此我无法使用它来检查客户端是否经过身份验证以读取项目。
我的问题是如何在 IParameterInspector.AfterCall 方法中访问服务实例 (PerCall)?
我还在使用 IOperationInvoker,我在 Invoke 方法中进行真正的身份验证(检查什么用户或是否匿名)。
我想知道 AfterCall 中的“输出”和“返回值”有什么区别?
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);
}
}