如何在不使用 OpenSAML Jar 的情况下解析 SAML 2.0 响应



这不是一个问题,而是我想分享的发现 上个月,我在不使用 OpenSAML 库替换解析 SAML 2.0 响应的逻辑时遇到了一些挣扎

在这里,我们需要对 SAML 响应进行解码和膨胀。命名空间将相同,因此可用于所有 SAML 响应分析。

我使用了 DOM 解析器。此代码只是为了获取用户名。相同的方法可用于读取签名并解析签名,我将在另一篇文章中展示。

private String decodeSAMLResponseUserIdandSession(String samlEncoded,
String type) throws IOException, ParserConfigurationException,
SAXException {
byte[] decodedValue = DatatypeConverter.parseBase64Binary(samlEncoded);
String tmlXml = new String(decodedValue, "utf-8");
if (!tmlXml.contains(":Response")) {
System.out.println("Inside the Unzip");
decodedValue = inflateValue(decodedValue);
}
String tmlXml2 = new String(decodedValue, "utf-8");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
dbFactory.setNamespaceAware(true);
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
StringReader strreader = new StringReader(tmlXml2);
InputSource isstream = new InputSource(strreader);
Document doc = dBuilder.parse(isstream);
doc.getDocumentElement().normalize();
NodeList nList = doc.getElementsByTagNameNS("urn:oasis:names:tc:SAML:2.0:assertion", "Subject");
System.out.println("----------------------------");
for (int temp = 0; temp < nList.getLength(); temp++) {
Node nNode = nList.item(temp);
if (nNode.getNodeType() == Node.ELEMENT_NODE) {
Element eElement1 = (Element) nNode;
System.out.println("First Name : "
+ eElement1.getElementsByTagNameNS("urn:oasis:names:tc:SAML:2.0:assertion", "NameID").item(0).getTextContent().toLowerCase());

}

}

}
private static byte[] inflateValue(byte[] decodedValue) throws IOException {
ByteArrayInputStream bis = new ByteArrayInputStream(decodedValue);
Inflater unzipper = new Inflater(true);
InflaterInputStream zipStream = new InflaterInputStream(bis, unzipper);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int read = zipStream.read(buf);
while (read > 0) {
bos.write(buf, 0, read);
read = zipStream.read(buf);
}
zipStream.close();
bos.close();

使用 OpenSAML库没有问题,因为 Oracle 问题指出那里使用了多个版本的 OpenSAML,例如:2.0.0 和 3.0.0。因此,只要您坚持使用一个版本,使用 opensaml jar 就不会有问题。希望这对你有帮助。

相关内容

  • 没有找到相关文章

最新更新