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

时间:2013-04-17 18:40:35

标签: wcf

我有一个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);
    }
}

1 个答案:

答案 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;}
}

你必须确保:

  • 如果您正在参加,则只能看到组对象。
  • 如果你参加,你应该能够看到其他人的名字,但是 不是他们的电话号码
  • 如果您参加,您应该能够看到主办单位名称 和电话号码
  • 如果您参加,则不应该看到任何待命的人
  • 如果您是组织者,您应该能够看到每个人的电话号码。

很快就会变得非常复杂。将复杂性推向存储库有助于。