我有一个WCF服务和几个操作,我返回基本poco项目的数组。
为了缓解我错误地返回客户端无权访问的项目的情况,我计划使用IParameterInspector,将其附加到IOperationBehavior-attribute,然后在AfterCall中验证读取访问权限。如果客户端没有读权限,那么我抛出一个WebFaultException。
我在items-repository(服务类)上使用自定义身份验证,当我输入IParameterInspector.AfterCall时,ServiceSecurityContext为null,因此我无法使用它来检查客户端是否经过身份验证以读取项目。 / p>
我的问题是如何在我的IParameterInspector.AfterCall方法中访问服务实例(PerCall)?
我也在使用IOperationInvoker,我在Invoke方法中进行真正的身份验证(检查用户或匿名用户)。
我想知道AfterCall中“outputs”和“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);
}
}
答案 0 :(得分:0)
您是否尝试过OperationContext.Current.ServiceSecurityContext.PrimaryIdentity?
修改:
string MyFunction( AThing something, BThing another )
在这种情况下,returnValue是MyFunction返回的字符串。产出将成为另一种产品。
使用参数检查器的通用方法的难点在于,它通常因对象而异,您将如何确定是否允许用户查看对象,或者允许他们查看哪些属性。
我通常采用的方法(不知道域的具体情况)是将用户的身份传递给存储库,并让存储库负责确保只返回用户有权访问的信息。
例如,如果您有以下内容:
public class GroupTrip
{
public string GroupName {get;set;}
public DateTime Start {get;set;}
public List<Person> Attendees {get;set;}
public Person Organizer {get;set;}
public bool IsStandBy {get;set;}
}
public class Person
{
public string Name {get;set;}
public string Phone {get;set;}
}
你必须确保:
很快就会变得非常复杂。将复杂性推向存储库有助于。