使用 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 请求的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 正确准备“HTTP 重定向绑定”SAML 请求

如何验证 HTTP 重定向绑定的 SAML 签名

SAML HTTP 重定向绑定中未保留查询字符串

单一登录 (SAML 协议)

使用 aws cdk 创建 sam canary 部署

AWS SAM - 无法创建变更集:Waiter ChangeSetCreateComplete failed