使用 Java 创建“HTTP 重定向绑定”SAML 请求
Posted
技术标签:
【中文标题】使用 Java 创建“HTTP 重定向绑定”SAML 请求【英文标题】:Create 'HTTP Redirect Binding' SAML Request using Java 【发布时间】:2014-12-16 13:47:23 【问题描述】:我正在尝试在 Java 中为 SAML HTTP 重定向绑定实现相同的算法,如下所述:How do I correctly prepare an 'HTTP Redirect Binding' SAML Request using C#
算法相当简单:
-
构建 SAML 字符串
压缩此字符串
Base64 编码字符串
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 的工作方式不同?
【问题讨论】:
【参考方案1】:您需要专门为noWrap
选项指定Deflater
。这是工作代码:
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" );
【讨论】:
nowrap - 如果为真,则使用 GZIP 兼容压缩(是否可以确定输入是 GZIP 压缩格式还是 GZIP 非压缩格式?)以上是关于使用 Java 创建“HTTP 重定向绑定”SAML 请求的主要内容,如果未能解决你的问题,请参考以下文章