SAML2 xml 结构化属性值

SAML2 xml structured attribute values

我一直在使用 Apache CXF 和 WSS4J 来实现 SecurityTokenService。

使用“CustomClaimsHandler”实现 "org.apache.cxf.sts.claims.ClaimsHandler" 我可以创建一个包含此类属性的 SAML 令牌:

<saml2:Attribute Name="http://schemas.xmlsoap.org/ws/2005/05/identity/claims/role" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:unspecified">
               <saml2:AttributeValue xsi:type="xs:string">admin</saml2:AttributeValue>
</saml2:Attribute>

问题是我现在正在尝试创建一个包含一些 XML 内容的属性。例如:

<saml2:Attribute Name="http://my/xml/content">
               <saml2:AttributeValue xsi:type="???">
        <somthing>
<somthingElse>text</somthingElse>
        </somthing>
</saml2:AttributeValue>
</saml2:Attribute>

我考虑过自定义实现“ClaimsAttributeStatementProvider”(org.apache.cxf.sts.claims),但我似乎必须使用 WSS4J 的“AttributeBean”class。但是这个class好像不让我改类型

现在有人如何处理这个问题吗?

============================================= =========================

根据 Colm 的回答进行编辑:

我在我的 CXF STS 项目中添加了对 opensaml-core v3.0.0 的依赖,以获取“org.opensaml.core.xml.config.XMLObjectProviderRegistrySupport”class,如您指向我的示例所示。 在调用 XMLObjectProviderRegistrySupport.getBuilderFactory() 之前,我似乎必须初始化 opensaml 的配置。我没有设法使用我认为 CXF 中的 WSS4J 正在使用的嵌入式配置。 我管理了初始化调用“org.opensaml.core.config.InitializationService.initialize();”

创建具有 XSAny 类型的 AttributeBean 似乎一切都很好。

问题出在 WSS4J 尝试处理 SAMLCallback 时:

Caused by: java.lang.ClassCastException: org.opensaml.core.xml.schema.impl.XSAnyBuilder cannot be cast to org.opensaml.xml.XMLObjectBuilder at org.opensaml.xml.XMLConfigurator.initializeObjectProviders(XMLConfigurator.java:236) at org.opensaml.xml.XMLConfigurator.load(XMLConfigurator.java:182) at org.opensaml.xml.XMLConfigurator.load(XMLConfigurator.java:166) at org.opensaml.xml.XMLConfigurator.load(XMLConfigurator.java:143) at org.apache.wss4j.common.saml.OpenSAMLBootstrap.initializeXMLTooling(OpenSAMLBootstrap.java:105) at org.apache.wss4j.common.saml.OpenSAMLBootstrap.bootstrap(OpenSAMLBootstrap.java:86) at org.apache.wss4j.common.saml.OpenSAMLUtil.initSamlEngine(OpenSAMLUtil.java:61) at org.apache.wss4j.common.saml.SamlAssertionWrapper.(SamlAssertionWrapper.java:204) at org.apache.cxf.sts.token.provider.SAMLTokenProvider.createSamlToken(SAMLTokenProvider.java:303) at org.apache.cxf.sts.token.provider.SAMLTokenProvider.createToken(SAMLTokenProvider.java:122) ... 45 more

我想我有一个版本问题:

要么我必须让我的 STS 的 opensaml 配置知道我的 opensaml-core v3.0.0 classes 或者我必须使用不同版本的 CXF 才能获得更新版本的 WSS4J。

我的 CXF 版本是 3.0.1,并且依赖于版本 2.0.1 中的 WSS4J-ws-security-common 依赖于 opensaml 版本 2.6.1

您知道如何解决这个问题吗?

此致

=========================

编辑 Colm 已解决 post 中的问题:

WSS4J 中的 AttributeBean class 的 setAttributeValues 方法允许您传递 OpenSAML XMLObject 对象。因此,您可以使用 OpenSAML 创建自定义属性类型,然后传递它们。这是 WSS4J 中的一个测试用例,它添加了一个 "Integer" 类型(参见 "testSAML2AttrAssertionIntegerAttribute"):

http://svn.apache.org/viewvc/webservices/wss4j/trunk/ws-security-dom/src/test/java/org/apache/wss4j/dom/saml/SamlTokenTest.java?view=markup