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