使用XPath在资源和主题之间进行XACML规则检查

时间:2016-02-29 14:38:52

标签: xpath authorization access-control xacml abac

我无法弄清楚如何编写可以解决此要求的规则:

我们假设我有这个要求:

<Request>
  <Attributes Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject">
    <Content>
      <Categories>
        <Category name="cat1">
          <CategoryValue>A</CategoryValue>
          <CategoryValue>B</CategoryValue>
          <CategoryValue>C</CategoryValue>
        </Category>
        <Category name="cat2">
          <CategoryValue>B</CategoryValue>
          <CategoryValue>E</CategoryValue>
          <CategoryValue>F</CategoryValue>
        </Category>
      </Categories>
    </Content>
  </Attributes>
  <Attributes Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource">
    <Content>
      <Categories>
        <Category name="cat1">
          <CategoryValue>A</CategoryValue>
        </Category>
        <Category name="cat2">
          <CategoryValue>A</CategoryValue>
          <CategoryValue>E</CategoryValue>
          <CategoryValue>F</CategoryValue>
          <CategoryValue>G</CategoryValue>
        </Category>
      </Categories>
    </Content>
  </Attributes>
</Request>

我想编写一个策略,其中包含一个带有 Permit 效果的规则,当对于资源的每个Category元素时,主题都有一个Category同一@name ,如果这两个Category元素至少有一个共同的CategoryValue

在上面的示例中:

  • 资源的“cat1”带有“A” - 主题有“cat1”,其中一个值为A:Permit
  • 资源有“cat2”,“A”,“E”,“F”,“G” - 主题有“cat2”,值为E(或F):Permit
  • 规则的最终结果:许可

我的问题不在于我应该使用哪个functionId,而是如何结合这些条件以使规则符合我的描述?如何比较具有相同GenericValue的节点的@name元素?

我想我必须在主题和资源“cat1”的值之间使用string-at-least-one-member-of函数,然后在主题和资源“cat2”之间使用@name函数,但真正的困难是PDP不知道Category元素的Sub paste_values() Dim wb_A As Workbook, ws_A As Worksheet Dim wb_B As Workbook, ws_B As Worksheet Dim last_row As Long Set wb_A = ThisWorkbook Set ws_A = wb_A.Sheets(1) Set wb_B = Workbooks("WorkbookB") Set ws_B = wb_B.Sheets(1) With ws_A last_row = .Range("A" & .Rows.Count).End(xlUp).Row End With ws_B.Range("A2:AX" & last_row).Value = ws_A.Range("A2:AX" & last_row).Value End Sub ,所以我不能直接在规则中硬编码,我不知道如何选择它们来执行检查。

对此有什么想法吗?

1 个答案:

答案 0 :(得分:0)

首先,您的请求无效。你缺少一些元素,例如。

  • ReturnPolicyIdList = “真”
  • CombinedDecision = “真”

其次,我建议您不要在XACML中使用XPath。它使您的政策难以编写(因此您的问题),难以维护,难以阅读(审计)。它在某种程度上违背了XACML的目的。让PEP进行繁重的XML处理,并使用属性值而不是XML内容发送属性。

此外,您无法控制XACML中XML中不同元素/属性值的迭代。我可以使用特定的@name值来实现您的用例,但我无法通过一组值来实现它。

假设有一个值,您必须按如下方式实现条件:

<xacml3:Rule RuleId="axiomatics-example-xacml30" Effect="Permit" xmlns:xacml3="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17">
     <xacml3:Target/>
     <xacml3:Condition >
          <xacml3:Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-at-least-one-member-of">
               <xacml3:AttributeSelector Path="/Categories/Category[@name='cat1']/CategoryValue/text()" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false" Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"/>
               <xacml3:AttributeSelector Path="/Categories/Category[@name='cat1']/CategoryValue/text()" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"/>
          </xacml3:Apply>
     </xacml3:Condition>
</xacml3:Rule>

但你不能真正迭代不同的值