You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Lucee生成的SAML认证请求无法被Firefox SAML Tracer识别的问题及正确实现方法咨询

Lucee生成的SAML认证请求无法被Firefox SAML Tracer识别的问题及正确实现方法咨询

嗨,我来帮你排查这个问题~你的SAML请求没法被Firefox SAML Tracer识别,核心问题出在压缩方式不符合SAML 2.0规范上,咱们一步步来理清楚:

问题根源

你当前代码里用cfzip做ZIP格式压缩,但SAML 2.0的HTTP-GET绑定明确要求使用DEFLATE压缩(RFC 1951标准的原始压缩数据,不带ZIP容器的额外信息)。ZIP压缩会自动添加文件头、目录结构等冗余内容,这会导致SAML Tracer无法解析出有效的SAML XML请求,自然就识别不了。

正确的实现步骤

  1. 生成符合规范的SAML XML请求(这部分你的代码是正确的,无需修改)
  2. 对XML字符串执行DEFLATE压缩(替换掉原来的ZIP压缩逻辑)
  3. 将压缩后的二进制数据做Base64编码
  4. 对Base64结果做URL编码(这部分你之前的代码没问题)

修改后的完整代码

<cfset uid=createUUID()>
<cfset setIssueIns=datetimeFormat(now(), "yyyy-MM-dd'T'HH:nn:ss'Z'")>

<cfset samlRequestXml='<?xml version="1.0" encoding="UTF-8" standalone="no"?><saml2p:AuthnRequest xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol"
AssertionConsumerServiceURL="http://yoursite/sso.cfm" Destination="https://youridp/sso" ForceAuthn="false" ID="#uid#" IsPassive="false" IssueInstant="#setIssueIns#" ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Version="2.0"><saml2:Issuer>http://yoursite/sso</saml2:Issuer></saml2p:AuthnRequest>'>

<cfscript>
// 将XML字符串转为二进制(UTF-8编码)
xmlBytes = charsetDecode(samlRequestXml, "UTF-8");

// 使用Java的Deflater执行DEFLATE压缩(符合SAML规范)
deflater = createObject("java", "java.util.zip.Deflater");
deflater.setLevel(java.util.zip.Deflater.BEST_COMPRESSION);
deflater.setInput(xmlBytes);
deflater.finish();

// 读取压缩后的二进制数据
compressedBytes = [];
buffer = createObject("java", "byte[]").init(1024);
while (!deflater.finished()) {
    bytesRead = deflater.deflate(buffer);
    if (bytesRead > 0) {
        arrayAppend(compressedBytes, arraySlice(buffer, 1, bytesRead));
    }
}
deflater.end();

// 合并压缩后的字节数组
finalCompressed = createObject("java", "byte[]").init(arraySum(arrayMap(compressedBytes, function(b) { return arrayLen(b); })));
offset = 0;
for (b in compressedBytes) {
    arrayCopy(b, 1, finalCompressed, offset + 1, arrayLen(b));
    offset += arrayLen(b);
}

// Base64编码
encodedRequest = binaryEncode(finalCompressed, "Base64");

// URL编码
samlreq = urlEncodedFormat(encodedRequest, "UTF-8");
</cfscript>

<br>
<form name="form1" method="get" action="https://youridp/sso">
<input type="hidden" name="SAMLRequest" value="<cfoutput>#samlreq#</cfoutput>">
<input type="submit" name="submit" id="submit" value="send request">
</form>

验证方法

用修改后的代码生成请求并提交,Firefox的SAML Tracer就能正确识别并解析出SAML请求的XML内容了,和你预期的效果一致。

备注:内容来源于stack exchange,提问作者AhmadZuwari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 11:13:04