1

我正在尝试检查 XACML 策略。我的主题(urn:ch:xxxx:attribute:subject:1.0: participantid)中有一个很长的上下文,我希望在我的长列表中找到它(urn:ch:xxxx:attribute:resource:1.0: particiencyids)资源上下文。我正在尝试使用函数integer-is-in来做到这一点。

到目前为止我已经尝试过:

<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:integer-is-in">
  <SubjectAttributeDesignator AttributeId="urn:ch:xxxx:attribute:subject:1.0:participantid" DataType="http://www.w3.org/2001/XMLSchema#long" />
  <ResourceAttributeDesignator AttributeId="urn:ch:xxxx:attribute:resource:1.0:participantids" DataType="http://www.w3.org/2001/XMLSchema#long" />
</Apply>

我已经对此进行了测试,并且效果很好。

<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:integer-is-in">
  <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#long">9000501</AttributeValue>
  <ResourceAttributeDesignator AttributeId="urn:ch:xxxx:attribute:resource:1.0:participantids" DataType="http://www.w3.org/2001/XMLSchema#long" />
</Apply>

那么我应该如何传递主题属性以便它工作呢?还是函数integer-is-in错误的方式?

问候

克里斯蒂亚诺

4

1 回答 1

2

AttributeDesignator 在 XACML 中被视为一个,换句话说,它是多值的。因此,您必须在应用integer-is-in之前对其应用integer-one-and-only函数,因为 integer-is-in 需要单个值(如 AttributeValue)作为第一个参数。

此外,integer-is-ininteger-one-and-only函数仅适用于 XACML 标准中的整数数据类型(来自 XML 模式),而不适用于long因此,您的第二个示例运行良好的事实告诉我您的 XACML 实现不是 100% XACML 兼容的。

最后,您在这里使用的是 XACML 2.0 语法,我强烈建议升级到 XACML 3.0,它通常修复和增强 XACML。在 XACML 3.0 中,修复程序如下所示:

<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:integer-is-in">
    <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:integer-one-and-only">
        <AttributeDesignator AttributeId="urn:ch:xxxx:attribute:subject:1.0:participantid" Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" DataType="http://www.w3.org/2001/XMLSchema#integer" MustBePresent="false" />
    </Apply>
    <AttributeDesignator AttributeId="urn:ch:xxxx:attribute:resource:1.0:participantids" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource" DataType="http://www.w3.org/2001/XMLSchema#integer" MustBePresent="false" />
</Apply>
于 2020-03-21T15:19:29.983 回答