SAML Redirect请求是否需从已注册域名发起?ADFS报解码错误如何解决
问题结论
首先明确:该解码错误和是否从注册域名跳转发起请求无关,ADFS返回解码错误是编码流程和XML格式问题导致的。
错误原因排查
- 编码流程不符合SAML 2.0 Redirect绑定规范
SAML Redirect绑定要求SAMLRequest的处理顺序为:- 生成无格式错误的AuthnRequest XML
- 进行DEFLATE压缩(注意要去掉zlib头和尾,只保留压缩数据)
- 进行BASE64编码
- 进行URL编码,再拼接为查询参数
你直接将BASE64编码结果拼入URL,BASE64中的+、/、=等特殊字符会被HTTP服务端解析时转义,导致原始BASE64串被篡改,无法正常解码。在线解码工具可以正常解析是因为你输入的是原始未被转义的BASE64串,没有经过URL传输环节的字符篡改。
- 原始XML存在格式错误
你提供的AuthnRequest XML中存在大量不必要的空格,比如< samlp: AuthnRequest标签名与前缀之间的空格、http: // localhost: 4200属性值中间的多余空格,虽然部分低容错的在线工具可以正常解析,但ADFS的XML解析器会严格校验格式,格式错误也会触发解码失败。
修复方案
- 先清理XML中的所有多余空格,确保标签、属性、属性值格式符合XML规范,示例清理后的XML如下:
<samlp:AuthnRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="aaf23196-1773-2113-474a-fe114412ab72" Version="2.0" IssueInstant="2021-09-10T14:52:21Z" AssertionConsumerServiceIndex="0" AttributeConsumingServiceIndex="0"> <saml:Issuer>http://localhost:4200</saml:Issuer> <samlp:NameIDPolicy Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"/> </samlp:AuthnRequest>
- 严格按照SAML Redirect绑定流程编码,BASE64编码后必须做URL编码再拼接为查询参数
- 额外确认:
http://localhost:4200需和ADFS侧注册的信赖方信任的标识符完全一致,否则解码通过后也会触发后续校验错误
内容的提问来源于stack exchange,提问作者Kadhiresh Gajendiran
相关产品推荐
相关产品推荐

