创建使用Java“HTTP重定向绑定” SAML请求(Create 'HTTP Redire

2019-10-21 04:07发布

我试图在Java中实现相同的算法用于SAML HTTP重定向绑定在此所说明: 如何正确准备用C#中的“HTTP重定向绑定” SAML请求

该算法很简单:

  1. 建立一个SAML字符串
  2. 压缩此字符串
  3. Base64编码字符串
  4. URLEncode的字符串。

这应该是等价的Java算法:

    public String encodeRedirectFormat( String samlXML ) throws IOException{
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            DeflaterOutputStream deflaterOutputStream = new DeflaterOutputStream(os);
            deflaterOutputStream.write( samlXML.getBytes( "UTF-8" ) );
            deflaterOutputStream.close();
            os.close();
            String base64 = Base64.encodeBase64String( os.toByteArray() );
            return URLEncoder.encode( base64, "UTF-8" );
    }

我尝试编码最简单的说法:

<saml2:Assertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"/>

这是输出:

eJyzKU7MzTGyciwuTi0qyczPU6jIzckrtgKL2iqVFuVZ5ScWZxZb5SXmphZblSRbBTv6%2BlgZ6RlYJcK0KOnbAQCHfRi3

然后尝试用一个在线工具,解码像

https://rnd.feide.no/simplesaml/module.php/saml2debug/debug.php

输出是无效的。 有人能找出错误? 也许在Java Deflater原理不同?

Answer 1:

你需要明确指示DeflaternoWrap选项。 这是工作的代码:

public String encodeRedirectFormat( String samlXML ) throws IOException{
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        Deflater deflater = new Deflater( Deflater.DEFAULT_COMPRESSION, true );
        DeflaterOutputStream deflaterOutputStream = new DeflaterOutputStream(os, deflater);
        deflaterOutputStream.write( samlXML.getBytes( "UTF-8" ) );
        deflaterOutputStream.close();
        os.close();
        String base64 = Base64.encodeBase64String( os.toByteArray() );
        return URLEncoder.encode( base64, "UTF-8" );
}


文章来源: Create 'HTTP Redirect Binding' SAML Request using Java