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请求,自然就识别不了。
正确的实现步骤
- 生成符合规范的SAML XML请求(这部分你的代码是正确的,无需修改)
- 对XML字符串执行DEFLATE压缩(替换掉原来的ZIP压缩逻辑)
- 将压缩后的二进制数据做Base64编码
- 对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
相关产品推荐
相关产品推荐

