Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wcf data services 用于WCF数据服务的XACML拦截器_Wcf Data Services_Xacml - Fatal编程技术网

Wcf data services 用于WCF数据服务的XACML拦截器

Wcf data services 用于WCF数据服务的XACML拦截器,wcf-data-services,xacml,Wcf Data Services,Xacml,有人能告诉我如何为WCF数据服务定义XACML拦截器的信息吗 对于数据源()中的每个实体,WCF数据服务的拦截器本质上是类型为Expression的lambda表达式,这将您限制为非常简单且几乎是静态的授权规则。另一方面,XACML是非常灵活和动态的授权解决方案。我想不出可能的通用集成方式。同时,非泛型集成非常简单: [QueryInterceptor ("Customers")] public Expression<Func<Customer, bool>> Filte

有人能告诉我如何为WCF数据服务定义XACML拦截器的信息吗

对于数据源()中的每个实体,WCF数据服务的拦截器本质上是类型为
Expression
的lambda表达式,这将您限制为非常简单且几乎是静态的授权规则。另一方面,XACML是非常灵活和动态的授权解决方案。我想不出可能的通用集成方式。同时,非泛型集成非常简单:

[QueryInterceptor ("Customers")]
public Expression<Func<Customer, bool>> FilterCustomers() 
{

    // First of all you need to get all request attributes
    // information could come from session, from cookies
    // from request, in this example I will only use subjectId
    // In XACML subjectId could be user name  
    var subjectId = GetSubjectId();

    // After you have all data, build XACML request
    // this code is specific to our XACML implementation
    var xacmlRequest = new XacmlDecisionRequestContext()
        .AddRequest(r => r
            .AddResource(a => a.Add(XacmlConstants.ResourceAttributes.ResourceId, new Uri("Customer", UriKind.RelativeOrAbsolute)))               
            .AddSubject(a => a.Add(XacmlConstants.SubjectAttributes.SubjectId, subjectId ))
        );

    // Evaluate request
    var result = PolicyDecisionPoint.Evaluate(xacmlRequest);

    // Based on XACML decision result you can construct expression
    // this example is simple true or false, but based on 
    // XACML Advices or XACML Attributes you can build much more
    // sophisticated expression

    if (result.Decisions.Single().Decision == XacmlDecision.Permit)
    {
        return () => true;
    }
    return () => false;
}
[QueryInterceptor(“客户”)]
公共表达式筛选器客户()
{
//首先,您需要获取所有请求属性
//信息可能来自会话、cookie
//在这个例子中,我将只使用subjectId
//在XACML中,subjectId可以是用户名
var subjectId=GetSubjectId();
//获得所有数据后,生成XACML请求
//此代码特定于我们的XACML实现
var xacmlRequest=新的XacmlDecisionRequestContext()
.AddRequest(r=>r
.AddResource(a=>a.Add(XacmlConstants.ResourceAttributes.ResourceId,新Uri(“客户”,UriKind.RelativeOrAbsolute)))
.AddSubject(a=>a.Add(XacmlConstants.SubjectAttributes.SubjectId,SubjectId))
);
//评估请求
var结果=政策决策点评估(xacmlRequest);
//基于XACML决策结果,您可以构造表达式
//这个例子很简单,是真是假,但基于
//您可以构建更多的XACML建议或XACML属性
//老练的表达
if(result.Decisions.Single().Decision==xacmldeccision.Permit)
{
return()=>true;
}
return()=>false;
}
本例假设您拦截对客户实体的访问。它只适用于查询。您应该将此方法放在DataService类中


示例基于Axiomatics PEP SDK for.NET(我正在开发此产品),但idea将应用于任何XACML实现。

此级别的拦截器不提供基于属性的访问控制(ABAC)。这意味着您可以限制对特定集合的访问,但不能限制对该集合中的实体的访问。您是正确的,WCF中没有提供单个位置来检查单个条目是否允许访问的扩展点。这是很好的理由。它会很慢(选择n+1问题)。因此,在最后,您应该有实际表示XACML策略的
表达式。对于这种情况,我们建议拦截。简而言之,它将SQL查询更改为包含条件。理论上,同样的想法也适用于
表达式