使用IParameterInspector阻止未经授权的用户在未正确访问WCF的情况下读取数据

使用IParameterInspector阻止未经授权的用户在未正确访问WCF的情况下读取数据,wcf,Wcf,我有一个WCF服务和几个操作,返回基本poco项目的数组 为了减少错误返回客户端无权访问的项目的情况,我计划使用IParameterInspector,将其附加到IOperationBehavior属性,然后在AfterCall中验证读取访问。如果客户端没有读取权限,则抛出WebFaultException 我正在对我的项目存储库(服务类)使用自定义身份验证,当我输入IParameterInspector.AfterCall时,ServiceSecurityContext为null,因此我无法使

我有一个WCF服务和几个操作,返回基本poco项目的数组

为了减少错误返回客户端无权访问的项目的情况,我计划使用IParameterInspector,将其附加到IOperationBehavior属性,然后在AfterCall中验证读取访问。如果客户端没有读取权限,则抛出WebFaultException


我正在对我的项目存储库(服务类)使用自定义身份验证,当我输入IParameterInspector.AfterCall时,ServiceSecurityContext为null,因此我无法使用它来检查客户端是否经过身份验证以读取项目

我的问题是如何访问IParameterInspector.AfterCall-method中的服务实例(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;
    }
}


您是否尝试过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;}
}
public-class-GroupTrip
{
公共字符串组名{get;set;}
公共日期时间开始{get;set;}
公共列表与会者{get;set;}
公共人物组织者{get;set;}
公共布尔值是备用的{get;set;}
}
公共阶层人士
{
公共字符串名称{get;set;}
公用字符串电话{get;set;}
}
您必须确保:

  • 仅当您正在参加时才能看到组对象
  • 如果你参加,你应该能够看到其他人的名字,但是 不是他们的电话号码
  • 如果你参加,你应该能够看到组织者的名字 电话号码
  • 如果你参加,你不应该看到任何待命的人
  • 如果你是组织者,你应该能够看到每个人的电话号码

它可能很快变得非常复杂。将复杂性推送到存储库会有所帮助

有关WCF扩展点的详细信息如下。ServiceSecurityContext为null,因为我使用的是自定义身份验证。您是说像“out”这样的输出吗?字符串MyFunction(输出某物,输出另一物)。我在存储库中已准备好此信息的筛选器,但如果某些不允许的信息错误地从我的repo中漏掉,我希望进行第二次单端点范围的检查以引发异常。此外,我不会从参数检查器中引发WebFaultException,我会引发UnauthorizedAccessException或自定义异常异常,然后在错误处理程序中处理并返回403。输出:操作可能已设置的任何out/ref参数。裁判:
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;}
}