问题
I am trying to implement the same algorithm in Java for SAML HTTP Redirect Binding which is described here: How do I correctly prepare an 'HTTP Redirect Binding' SAML Request using C#
The algorithm is rather simple:
- Build a SAML string
- Compress this string
- Base64 encode the string
- UrlEncode the string.
This should be the equivalent Java algorithm:
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" );
}
I try to encode the simplest assertion:
<saml2:Assertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion"/>
This is the output:
eJyzKU7MzTGyciwuTi0qyczPU6jIzckrtgKL2iqVFuVZ5ScWZxZb5SXmphZblSRbBTv6%2BlgZ6RlYJcK0KOnbAQCHfRi3
And then try to decode with an online tool like
https://rnd.feide.no/simplesaml/module.php/saml2debug/debug.php
the output is invalid. Can someone spot the error? Maybe the Java Deflater works differently?
回答1:
You need to instruct specifically the Deflater
for noWrap
option. This is the working code:
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" );
}
来源:https://stackoverflow.com/questions/26484948/create-http-redirect-binding-saml-request-using-java