WSO2 ESB调用SAML保护服务遇ErrorInObtainingToken错误求助
解决方案:WSO2 ESB调用SAML保护服务时ErrorInObtainingToken问题处理
根据你提供的错误日志和流程描述,问题核心是第二步调用业务服务时,ESB错误地触发了向业务服务请求令牌的逻辑,而业务服务不支持requestSecurityToken操作,导致出现Message Receiver not found错误。以下是针对性解决步骤:
1. 修正业务服务的策略配置
你当前可能错误地将STS的签发方策略应用到了业务服务上,导致ESB试图向业务服务发起令牌请求。业务服务需要的是SAML令牌验证策略,而非令牌获取策略:
- 移除业务服务策略中的
<sp:IssuedToken>配置(该配置会触发STS调用),替换为<sp:SAMLSenderToken>,指定直接使用已获取的SAML令牌:<sp:SAMLSenderToken> <wsp:Policy> <sp:WssSamlV20Token11/> </wsp:Policy> </sp:SAMLSenderToken> - 确保策略中仅包含令牌验证相关配置,不要包含STS地址、密钥等签发方参数。
2. 正确存储与复用已获取的SAML令牌
第一步成功获取SAML令牌后,需要将其存储到ESB上下文,第二步调用业务服务时直接引用:
- 在第一步STS调用成功后,使用
<property>mediator将SAML令牌保存到message context:<property name="SAML_TOKEN" expression="//wsse:Security/wsse:Assertion" scope="default"/> - 第二步调用业务服务前,使用
<enrich>mediator将令牌插入到wsse:Security头中:<enrich> <source type="property" property="SAML_TOKEN"/> <target type="header" action="set" xpath="//wsse:Security"/> </enrich> - 添加时间戳:使用WSO2的
<timestamp>mediator自动生成符合WS-Security标准的时间戳头:<timestamp expires="300"/>
3. 排查端点与代理配置错误
- 检查业务服务的代理/端点配置,确保其出站策略未关联STS获取逻辑。错误日志中请求的
http://localhost:8280/.../token是业务服务端点,而非STS,说明策略中的STS地址被错误指向了业务服务。 - 确保第一步调用STS的代理和第二步调用业务服务的代理是独立配置的,各自关联对应的策略(签发方策略给STS代理,消费方策略给业务服务代理)。
4. 调试与验证令牌传递
- 启用ESB的DEBUG日志,查看message context中的令牌内容是否正确:
<log level="custom"> <property name="SAML_Token_Content" expression="get-property('SAML_TOKEN')"/> </log> - 使用SOAPUI等工具捕获第二步的请求,验证wsse:Security头是否包含完整的SAML断言和时间戳,格式是否符合业务服务的要求。
内容的提问来源于stack exchange,提问作者Nervell
相关产品推荐
相关产品推荐

