Wcf data services 用于WCF数据服务的XACML拦截器
有人能告诉我如何为WCF数据服务定义XACML拦截器的信息吗 对于数据源()中的每个实体,WCF数据服务的拦截器本质上是类型为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
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查询更改为包含条件。理论上,同样的想法也适用于表达式
。