WSO2 Identity Server SAML 2.0请求解码错误,求排查原因
问题
我正在通过如下代码生成SAML 2.0请求:
string samlRequestXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><samlp:AuthnRequest AssertionConsumerServiceURL=\"https://localhost:44395/home/AssertionPage\" Destination=\"https://localhost:9443/samlsso\" ForceAuthn=\"false\" ID=\"hloijnnfkolebkokdhgicdfehjdkkoblhekbcapg\" IsPassive=\"false\" IssueInstant=\"2023-07-20T13:20:31.134Z\" ProtocolBinding=\"urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST\" Version=\"2.0\" xmlns:samlp=\"urn:oasis:names:tc:SAML:2.0:protocol\"><samlp:Issuer xmlns:samlp=\"urn:oasis:names:tc:SAML:2.0:assertion\">MAssertionName</samlp:Issuer><saml2p:NameIDPolicy AllowCreate=\"true\" Format=\"urn:oasis:names:tc:SAML:2.0:nameid-format:persistent\" SPNameQualifier=\"Issuer\" xmlns:saml2p=\"urn:oasis:names:tc:SAML:2.0:protocol\"/><saml2p:RequestedAuthnContext Comparison=\"exact\" xmlns:saml2p=\"urn:oasis:names:tc:SAML:2.0:protocol\"><saml:AuthnContextClassRef xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\">urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml:AuthnContextClassRef></saml2p:RequestedAuthnContext></samlp:AuthnRequest>"; byte[] samlRequestBytes = Encoding.UTF8.GetBytes(samlRequestXml); string encodedSamlRequest = Convert.ToBase64String(samlRequestBytes); string URL_Encode = HttpUtility.UrlEncode(encodedSamlRequest); string request = "https://localhost:9443/samlsso?SAMLRequest=" + URL_Encode; return Redirect(request);
但控制台出现如下错误:
Error when processing the authentication request! org.wso2.carbon.identity.base.IdentityException: Error when decoding the SAML Request.
错误分析与修复方案
Issuer元素命名空间误用
Issuer属于urn:oasis:names:tc:SAML:2.0:assertion断言命名空间,你错误给它指定了对应协议命名空间的samlp前缀,导致XML结构不合法。需要给断言命名空间指定saml前缀,用saml:Issuer标签。NameIDPolicy和RequestedAuthnContext前缀错误
这两个元素属于SAML 2.0协议命名空间(urn:oasis:names:tc:SAML:2.0:protocol),你使用了未定义的saml2p前缀,应该直接使用根元素的samlp前缀。修复后的正确XML示例
<?xml version="1.0" encoding="UTF-8"?> <samlp:AuthnRequest AssertionConsumerServiceURL="https://localhost:44395/home/AssertionPage" Destination="https://localhost:9443/samlsso" ForceAuthn="false" ID="hloijnnfkolebkokdhgicdfehjdkkoblhekbcapg" IsPassive="false" IssueInstant="2023-07-20T13:20:31.134Z" ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Version="2.0" xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"> <saml:Issuer>MAssertionName</saml:Issuer> <samlp:NameIDPolicy AllowCreate="true" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent" SPNameQualifier="Issuer"/> <samlp:RequestedAuthnContext Comparison="exact"> <saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</saml:AuthnContextClassRef> </samlp:RequestedAuthnContext> </samlp:AuthnRequest>
- 补充说明
你采用的编码流程(UTF8转字节→Base64编码→URL编码)符合SAML 2.0 HTTP-Redirect绑定要求,核心问题是XML本身的命名空间错误,导致IDP无法正确解析XML,进而触发解码错误。
内容的提问来源于stack exchange,提问作者Tauqeer
相关产品推荐
相关产品推荐

