我正在尝试使用WSO2实现单点注销,但已经碰壁了。
发起服务提供商成功地将注销请求发送到IdP(WSO2),并接收注销响应。但是,没有其他登录的服务提供商从IdP接收注销命令。
我已经通过控制台为LogoutRequestSender类启用了调试级日志记录,我看到以下日志:“将一个logoutReqSenderTask分配给线程池”。
查看LogoutRequestSender类的源代码,私有类“LogoutReqSenderTask”(实现“Runnable”)应该创建一个带有SAMLRequest值的调试日志:
public void run() {
List<NameValuePair> logoutReqParams = new ArrayList<NameValuePair>();
// set the logout request
logoutReqParams.add(new BasicNameValuePair("SAMLRequest", logoutReqDTO.getLogoutResponse()));
if(log.isDebugEnabled()) {
try {
log.debug("SAMLRequest : " + SAMLSSOUtil.decodeForPost(logoutReqDTO.getLogoutResponse()));
} catch (IdentityException e) {
log.debug(e);
}
}
//...snip...
}
但是,此日志永远不会被写入,表明此代码未被执行。
我能想到的唯一想法是“run”方法在进入方法的第一个“try”之前遇到未处理的excpetion,因此永远不会写入日志(因为这代码使用“ExecutorService”对线程进行排队,未处理的异常将以静默方式失败。
以下是我从SP发送给IdP的退出请求示例(匿名):
<samlp:LogoutRequest
xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
ID="S2E267375A5BFB18E3B54FE839AF43B2F84AAE1E7A"
Version="2.0"
IssueInstant="2015-05-13T20:19:41Z"
Destination="[SSO Server Location]">
<saml:Issuer xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">[Issuer name]</saml:Issuer>
<saml:NameID xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient" NameQualifier="[SSO Server Location]">UserName</saml:NameID>
<samlp:SessionIndex xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">d1b98786-f9d7-45dd-9712-a63f8f64cb02</samlp:SessionIndex>
</samlp:LogoutRequest>
我在这里做错了什么?