0

我正在尝试使用 OpenSAML 使用现有的断言元素为令牌更新过程创建 SAML 2.0 断言。

 // Obtain the token
            Token tk = tkStorage.getToken(data.getTokenId());

            OMElement assertionOMElement = tk.getToken();
            int samlRstversion = data.getSamlRstVersion(); 
if(samlRstversion == 2) {
                    DefaultBootstrap.bootstrap();
                    UnmarshallerFactory unmarshallerFactory = Configuration.getUnmarshallerFactory();
                    Unmarshaller unmarshaller = unmarshallerFactory.getUnmarshaller((Element)assertionOMElement);
                    Element x1 = (Element)assertionOMElement;
                    Assertion samlAssertion = (Assertion) unmarshaller
                            .unmarshall(x1);
    //Add conditions to the assertion
}

我收到两个错误。

  1. 使用DefaultBootstrap.bootstrap();时会抛出异常java.lang.UnsupportedOperationException: This parser does not support specification "null" version "null"
  2. DefaultBootstrap.bootstrap()被移除时,它会抛出 Assertion samlAssertion =(Assertion) unmarshaller.unmarshall(x1);

有什么我错过的吗?

4

2 回答 2

1

首先,您总是必须运行引导程序,否则会出错。

它看起来像第一个错误是因为您的 JAXP 实现太旧 https://lists.internet2.edu/sympa/arc/mace-opensaml-users/2010-01/msg00015.html

OpenSAML 团队建议使用 Apache Xerces 或 Xalan。

于 2014-08-23T00:23:34.560 回答
0

有两个错误导致异常。当然,bootsrap()必须这样做才能继续编组或解组。

  1. 在前一行代码中,DOM实现更改为DOOM. DocumentBuilderFactoryImpl.setDOOMRequired(true); 即使它已被弃用,代码仍在使用它。因此,bootstrap()必须先将其设置为,false因为底层 JAXB 实现使用 DOM。

  2. 此外,强制转换OMElement assertionOMElementElement抛出此异常。org.w3c.dom.DOMException: NAMESPACE_ERR: An attempt is made to create or change an object in a way which is incorrect with regard to namespaces.

解决方案是将其转换OMElementString,然后Document从中构建并获取DocumentElement

String s = assertionOMElement.toString();
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
documentBuilderFactory.setNamespaceAware(true);
DocumentBuilder docBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = docBuilder.parse(new ByteArrayInputStream(s.trim().getBytes()));
Element element = document.getDocumentElement();
于 2014-09-03T11:58:31.637 回答