java - 使用 Java 创建 'HTTP Redirect Binding' SAML 请求

标签 java base64 saml http-redirect deflate

我正在尝试在 Java 中为 SAML HTTP 重定向绑定(bind)实现相同的算法,如下所述:How do I correctly prepare an 'HTTP Redirect Binding' SAML Request using C#

算法相当简单:

  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 的工作方式有所不同?

最佳答案

您需要为 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" );
}

关于java - 使用 Java 创建 'HTTP Redirect Binding' SAML 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26484948/

相关文章:

azure - 如何使用 SAML 将 Okta 作为 IDP 与 Azure AD B2C 集成?

java - 如何在 Java 中解码从 Azure 获取的 SAML token ?

c# - 使用 HtmlAgilityPack 检测图像 src 中的数据 URI

java - Glassfish OpenSSO 说明(从哪里下载 OpenSSO)?

java - 告诉 Hibernate 只为一个实体创建一个新表

java - 如何烘烤验证错误消息显示未选择微调器中的任何项目?

android - Kotlin 中的 String 属性可以有多长?

c++ - Base64解码错误

java - 在 Java 中检查字符串是否为回文

java - 我应该如何在 Java 中复制字符串?