您好我正在尝试使用XACML3,并且我发现该请求在匹配条件时获得响应为Permit。但是当它不是我不适用而不是拒绝。我不确定行为是否正确。
我明白我可以用deny-unless-permit
组合算法掩盖不适用的响应,但我不明白这种行为。
以下是我的政策
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Policy xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" PolicyId="urn:oasis:names:tc:xacml:2.0:conformance-test:IIA1:policy"
RuleCombiningAlgId="urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:deny-overrides"
Version="1.0">
<Target>
<AnyOf>
<AllOf>
<Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">MyApp</AttributeValue>
<AttributeDesignator
AttributeId="urn:oasis:names:tc:xacml:1.0:resource:resource-id"
DataType="http://www.w3.org/2001/XMLSchema#string"
Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"
MustBePresent="true" />
</Match>
</AllOf>
</AnyOf>
</Target>
<Rule Effect="Permit"
RuleId="urn:oasis:names:tc:xacml:2.0:conformance-test:IIA1:rule">
<Target />
<Condition>
<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:integer-equal">
<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:integer-one-and-only">
<AttributeDesignator
AttributeId="urn:oasis:names:tc:xacml:2.0:conformance-test:age"
Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
DataType="http://www.w3.org/2001/XMLSchema#integer" MustBePresent="false" />
</Apply>
<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:integer-one-and-only">
<AttributeDesignator
AttributeId="urn:oasis:names:tc:xacml:2.0:conformance-test:age2"
Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"
DataType="http://www.w3.org/2001/XMLSchema#integer" MustBePresent="false" />
</Apply>
</Apply>
</Condition>
</Rule>
</Policy>
这是我的请求,我的回复是不适用的
<?xml version="1.0" encoding="utf-8"?>
<Request ReturnPolicyIdList="false" CombinedDecision="false" xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Attributes Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject">
<Attribute IncludeInResult="false" AttributeId="urn:oasis:names:tc:xacml:2.0:conformance-test:age">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#integer">45</AttributeValue>
</Attribute>
<Attribute IncludeInResult="false" AttributeId="urn:oasis:names:tc:xacml:2.0:conformance-test:age2">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#integer">4</AttributeValue>
</Attribute>
</Attributes>
<Attributes Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource">
<Attribute IncludeInResult="false" AttributeId="urn:oasis:names:tc:xacml:1.0:resource:resource-id">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">MyApp</AttributeValue>
</Attribute>
</Attributes>
</Request>
只有当年龄和年龄2匹配时,我才会获得Permit响应,否则响应不适用。不适用意味着没有找到匹配规则,但Target确实与resource-id
字符串成功匹配,那么为什么响应不适用?任何帮助表示赞赏。
答案 0 :(得分:1)
获取NotApplicable是正常的响应。事实上,它可能是最常见的反应。
XACML在响应中定义了4个可能的决策:
首次编写策略时,很容易点击NotApplicable,因为它实际上意味着您的请求与策略不匹配。想象一下,您的保单是关于银行账户的,并且您发送了有关健康记录的请求。你得到了NotApplicable。
有一些方法可以屏蔽NotApplicable并强制PDP返回Permit或Deny。一种方法是使用以下任一组合算法:
如果您的策略包含3条规则且不适用,则该策略通常会返回NotApplicable。使用前面两种组合算法之一,您将获得Permit或Deny。
另一个选择是使用另一个规则作为全能,拒绝任何先前未处理过的访问。在这种情况下,父组合算法需要首先适用。见下文。
在XACML中,您可以使用两个关键元素来定义授权策略的范围(广义上):
role=="manager" and age>18
。age>ageLimit
。你不能在Target中做后者。要使规则适用,目标和条件(如果有)必须评估为真。