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"):
冷
我一直在使用 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"):
冷