Xml 如何在不使用OpenSAMLJAR的情况下解析SAML2.0响应

Xml 如何在不使用OpenSAMLJAR的情况下解析SAML2.0响应,xml,saml,saml-2.0,opensaml,Xml,Saml,Saml 2.0,Opensaml,这不是一个问题,而是一个我想分享的发现。上个月,我在替换逻辑以解析SAML2.0响应时,在不使用OpenSAML库的情况下,遇到了一些困难 这里我们需要解码并放大SAML响应。名称空间将是相同的,因此这可以用于所有SAML响应解析 我使用了DOM解析器。此代码仅用于获取用户名。同样的方法也可以用于读取签名和解析签名,我将在另一篇文章中介绍 private String decodeSAMLResponseUserIdandSession(String samlEncoded,

这不是一个问题,而是一个我想分享的发现。上个月,我在替换逻辑以解析SAML2.0响应时,在不使用OpenSAML库的情况下,遇到了一些困难

这里我们需要解码并放大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();
私有字符串解码SamlResponseUserAndSession(字符串samlEncoded,
字符串类型)引发IOException、ParserConfiguration异常,
萨克斯例外{
字节[]decodedValue=DatatypeConverter.parseBase64Binary(samlEncoded);
字符串tmlXml=新字符串(解码值,“utf-8”);
如果(!tmlXml.contains(“:Response”)){
System.out.println(“内部解压”);
解码值=充气值(解码值);
}
字符串tmlXml2=新字符串(解码值,“utf-8”);
DocumentBuilderFactory dbFactory=DocumentBuilderFactory.newInstance();
dbFactory.setNamespaceAware(true);
DocumentBuilder dBuilder=dbFactory.newDocumentBuilder();
StringReader strreader=新的StringReader(tmlXml2);
InputSource isstream=新的InputSource(strreader);
documentdoc=dBuilder.parse(isstream);
doc.getDocumentElement().normalize();
NodeList nList=doc.getelementsbytagnames(“urn:oasis:names:tc:SAML:2.0:assertion”,“Subject”);
System.out.println(“-------------------------------”;
对于(int-temp=0;temp0){
bos.write(buf,0,read);
read=zipStream.read(buf);
}
zipStream.close();
bos.close();

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

使用OpenSAML没有问题因为Oracle问题指出有几个版本的OpenSAML正在使用,例如:2.0.0和3.0.0。因此,只要您坚持使用一个版本,使用OpenSAML jar就不会有问题。希望这对您有所帮助。

出于好奇,您为什么选择这样做,而不是使用受信任和维护的软件包?选择DIY SAML处理似乎很愚蠢。为了避免这种情况,我没有选择在EAR中更改首选的web inf类,因为EAR来自第三方,我没有权限更改它以使我的SAML插件代码正常工作。此外,Weblogic admin不允许它删除我们内部的openSamlblogic modules.Ugh.这听起来像是一场噩梦。甲骨文在破解问题上非常有用…听起来可能值得去看看另一家中间件提供商…编写DIY代码正确解析SAML响应当然是可能的,但签名处理变得更疯狂。祝你好运。只是出于好奇,你为什么选择这样做这样做,而不是使用一个受信任和维护的包?选择DIY SAML处理似乎很愚蠢。为了避免这种情况,我没有选择在EAR中更改首选的web inf类,因为EAR来自第三方,我没有权限更改它,只是为了让我的SAML插件代码工作。此外,Weblogic admin不允许它删除weblogic modules.Ugh中的openSaml。这听起来像是一场噩梦。Oracle在破解问题上非常有用……听起来可能值得去看看另一家中间件提供商……编写DIY代码正确解析SAML响应当然是可能的,但签名处理变得更疯狂。最好运气。