WSO2IS - 具有自定义属性的 XACML 策略返回“找不到 AttributeDesignator”

Posted

技术标签:

【中文标题】WSO2IS - 具有自定义属性的 XACML 策略返回“找不到 AttributeDesignator”【英文标题】:WSO2IS - XACML Policy with custom attributes is returning "Couldn't find AttributeDesignator" 【发布时间】:2017-03-28 20:49:14 【问题描述】:

我在 WSO2IS 中创建了以下策略:

<Policy xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17" PolicyId="check-blacklist-users-in-login" RuleCombiningAlgId="urn:oasis:names:tc:xacml:1.0:rule-combining-algorithm:first-applicable" 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">login</AttributeValue>
                <AttributeDesignator AttributeId="urn:custom:company:1.0:operation:login-id"
                                     Category="urn:custom:company:1.0:attribute-category:operation"
                                     DataType="http://www.w3.org/2001/XMLSchema#string"
                                     MustBePresent="true"/>
            </Match>
        </AllOf>
    </AnyOf>
</Target>
<Rule Effect="Permit" RuleId="permit-blacklisted-users-with-step-up">
    <Target>
        <AnyOf>
            <AllOf>
                <Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
                    <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">vip</AttributeValue>
                    <AttributeDesignator AttributeId="urn:custom:company:1.0:user-group:vip-id"
                                         Category="urn:custom:company:1.0:attribute-category:user-group"
                                         DataType="http://www.w3.org/2001/XMLSchema#string"
                                         MustBePresent="true"/>
                </Match>
            </AllOf>
        </AnyOf>
    </Target>
    <Condition>
        <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
            <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-one-and-only">
                <AttributeDesignator AttributeId="urn:custom:company:1.0:is-user-in-blacklist:is-user-in-blacklist-id"
                                     Category="urn:custom:company:1.0:attribute-category:is-user-in-blacklist"
                                     DataType="http://www.w3.org/2001/XMLSchema#string"
                                     MustBePresent="true"/>
            </Apply>
            <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">true</AttributeValue>
        </Apply>
    </Condition>
    <ObligationExpressions>
        <ObligationExpression FulfillOn="Permit" ObligationId="extra-email">
            <AttributeAssignmentExpression AttributeId="extra-email">
                <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">send-email</AttributeValue>
            </AttributeAssignmentExpression>
        </ObligationExpression>
    </ObligationExpressions>
</Rule>
</Policy>

但是当我发送以下 XACML 请求时:

<Request xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17" CombinedDecision="false" ReturnPolicyIdList="false">

<Attributes Category="urn:custom:company:1.0:attribute-category:operation">
    <Attribute AttributeId="urn:custom:company:1.0:operation:login-id" IncludeInResult="false">
        <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">login</AttributeValue>
    </Attribute>
</Attributes>

<Attributes Category="urn:custom:company:1.0:attribute-category:user-group">
    <Attribute AttributeId="urn:custom:company:1.0:user-group:vip-id" IncludeInResult="false">
        <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">vip</AttributeValue>
    </Attribute>
</Attributes>

<Attributes Category="urn:custom:company:1.0:attribute-category:is-user-in-blacklist">
        <Attribute AttributeId="urn:custom:company:1.0:users:user-id" IncludeInResult="false">
        <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">userJon</AttributeValue>
    </Attribute>
</Attributes>
</Request>

我总是收到关于 AttributeDesignator 的不确定错误:

<Response xmlns="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17">
<Result>
    <Decision>Indeterminate</Decision>
    <Status>
        <StatusCode Value="urn:oasis:names:tc:xacml:1.0:status:processing-error"/>
        <StatusMessage>Couldn't find AttributeDesignator attribute</StatusMessage>
    </Status>
</Result>
</Response>

我使用以下代码创建了一个自定义 PIPAttributeFinder:

    public class DatabaseAttributeFinder extends LoginDBAttributeFinder 

    private DataSource dataSource;
    private Set<String> supportedAttributes = new HashSet<String>();
    private static Log log = LogFactory.getLog(DatabaseAttributeFinder.class);

    private static final String BLACKLISTED_USER_ID = "urn:custom:company:1.0:is-user-in-blacklist:is-user-in-blacklist-id";

    @Override
    public void init(Properties properties) throws Exception 
        String dataSourceName = (String) properties.get("DataSourceName");

        if(dataSourceName == null || dataSourceName.trim().length() == 0)
            throw new Exception("Data source name can not be null. Please configure it in the entitlement.properties file.");
        

        dataSource = (DataSource) InitialContext.doLookup(dataSourceName);

        supportedAttributes.add(BLACKLISTED_USER_ID);
    

... (other code)

LoginDBAttributeFinder 类如下所示:

public abstract class LoginDBAttributeFinder implements PIPAttributeFinder 

    protected int tenantId;
    private boolean isAbstractAttributeCachingEnabled = false;
    private PIPAbstractAttributeCache abstractAttributeFinderCache = null;
    private static Log log = LogFactory.getLog(LoginDBAttributeFinder.class);

    public LoginDBAttributeFinder() 
    

    public abstract Set<String> getAttributeValues(String blacklistUserId,
                                                   String attributeId,
                                                   String issuer) throws Exception;

    @Override
    public Set<String> getAttributeValues(URI attributeType, URI attributeId, URI category, String issuer, EvaluationCtx evaluationCtx) throws Exception 
        String blacklistUserId = null;
        Set attributeValues = null;
        this.tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId();

        EvaluationResult blacklistUser = evaluationCtx.getAttribute(new URI("http://www.w3.org/2001/XMLSchema#string"), new URI("urn:custom:company:1.0:users:user-id"), issuer, new URI("urn:custom:company:1.0:attribute-category:is-user-in-blacklist"));

        attributeValues = this.getAttributeValues(blacklistUserId, attributeId.toString(), issuer);

        return attributeValues;

... (other code)

我已经在 WSO2IS 中成功注册了 jar(它显示在管理控制台中),每当我转到 TryIt 选项并测试特定策略(check-blacklist-users-in-login)时,它都会返回 Permit,但是当我转到 WSO2IS 控制台中的侧面菜单“工具”,并使用通用“TryIt”工具,它返回 Indeterminate(找不到 AttributeDesignator)。

似乎找不到策略,因此找不到与该策略支持的属性相关的 AttributeDesignator。

我也尝试过使用 REST API (https://WSO2ISIP:4443/api/identity/entitlement/decision/pdp),我也得到:Indeterminate (Couldn't find AttributeDesignator)

关于如何解决这个问题的任何想法?

【问题讨论】:

您返回的 XACML 错误代码无效。从 XACML 的角度来看,“找不到 AttributeDesignator 属性”没有意义。在 Axiomatics PDP 上,错误只是该属性缺少值。 我也审查了您的政策...您使用字符串作为 is-user-in-blacklist-id 而实际上您应该使用布尔值。另外最好做 stringIsIn(stringOneAndOnly(userId), blacklist)。更有意义 @David Brossard,是的,值应该是布尔值,这是我积压的东西。谢谢你在 stringlsln 上,我会检查一下。关于错误,是的,它应该是不同的,或更有意义的。 出于好奇,您正在构建什么?查看我的博客,了解很多 XACML 技巧:axiomatics.com/blog.html 目前没什么大不了的,只是了解XACML和授权流程。 【参考方案1】:

我通过以下步骤找到了解决方案:

    停止 WSO2IS 服务器 在文件中注释您的 customAttributeFinder 类(在我的例子中是 DatabaseAttributeFinder): &lt;WSO2IS_HOME&gt;/repository/conf/identity/entitlement.properties 启动 WSO2IS 服务器 转到管理控制台并检查是否在权利的扩展部分中没有加载 customAttributeFinder。 停止 WSO2IS 服务器 在步骤 2 的文件中取消注释您的 customAttributeFinder 启动 WSO2IS 神奇的是,一切都应该正常工作。

WSO2IS 中似乎存在一个错误,每当我修改标准策略编辑器的任何内容时,XACML 引擎都会开始以一种非常奇怪的方式运行。

我见过几个 *** 答案,其中所有问题都只需重新启动服务器即可解决。

如果您不希望 WSO2IS 开始慢慢发疯,请远离 XACML 策略编辑器。

如果您需要证明,请查看此 Jira 问题(特别是在 cmets 部分):https://wso2.org/jira/browse/IDENTITY-5447

【讨论】:

如果您需要编写 XACML 策略,请查看 ALFA for XACML【参考方案2】:

在我的例子中,我的一个策略是使用具有错误命名空间的属性,所以基本上 XACML 引擎找不到该属性,然后我收到了这个错误。有趣的是,当我提出一个不需要由该策略评估的请求(命名空间中有错字)但另一个策略时,也会发生这种情况。

所以,如果有人遇到这个问题,我建议检查以下内容。 1.所有策略中的属性名都正确。 2. 验证属性的命名空间,属性实际上属于定义的命名空间。

【讨论】:

以上是关于WSO2IS - 具有自定义属性的 XACML 策略返回“找不到 AttributeDesignator”的主要内容,如果未能解决你的问题,请参考以下文章

XACML 策略 - 获得“不确定”响应

WSO2IS/APIM:如何在自定义身份验证器中分配用户角色

比较 XACML 策略中的两个多元素属性

XACML Authzforce PDP 自定义策略

XACML 政策 - 是不是正确?

如何自定义 wso2is PAP?