SAMLResponse 是否应该包含额外的换行符?

Should SAMLResponse contain extra line breaks?

我一直在研究从 third-party IdP 检索 SAMLResponse 的解决方案,我们只需使用 jdk Base64 解码器解码 SAMLResposne, 然而,其中一种情况是我们在某些字符后得到带有换行符 (\n) 的 SAMLResponse,当我们尝试使用

对其进行解码时
...
byte[] base64DecodedResponse = Base64.getDecoder().decode(authnResponse);
...

这个 authnResposne 是来自 HTTP header 的 SAMLResponse,它有 \n 新行,这在上面的代码中解析失败。 我一直在寻找确认 SP 收到的任何 SAMLResponse 是否必须采用 Base64 编码格式,因此不应包含换行符,或者它可以包含并且 SP 应该处理它。

从 SP 端应用修复很简单,只需 .replaceAll("\n","") 即可,但编辑 SAMLResponse 真的是行业标准吗?

您可能需要使用 Base64.Decoder getUrlDecoder()

SAML2 应该在 base64url 中编码 - 基本上是使用 URL 和文件名安全字母 https://www.rfc-editor.org/rfc/rfc4648#section-5.

的 Base 64 编码

getUrlDecoder 还应拒绝 base64 中的嵌入换行符,因此它可能对您没有任何好处。

我很想知道您使用的是哪个 SAML 提供商。

在这里寻找智慧的人,

在签名后编辑 SAMLResponse 是不好的做法。

根据 SAML 文档,SAMLResponse 编码可以采用 BASE 64 内容传输编码 RFC-2045 or Base64 Encoding RFC-4648

来自 SAML 2.0 core-doc,第 5 部分

Profiles MAY specify alternative signature mechanisms such as S/MIME or signed Java objects that contain SAML documents. Caveats about retaining context and interoperability apply

这导致 SP 应该能够解码标准和 MiMe 解码的理由,因此使用 Base64.getMimeDecoder() 的 try and catch 块来解决这个问题。