我正在使用SAML为运行在Tomcat上的Web服务器实现SSO身份验证流程。当使用POST或Redirect绑定时一切正常,但根据我所读的内容,为了支持REST API前面的SAML身份验证,我还需要配置和使用ECP配置文件。
首先请纠正我,如果我错了,那么ECP流程应该是这样的:
1. 客户端访问SP REST API
- 客户端知道他需要进行身份验证,因此设置所需的ECP标头(`Accept: application/vnd.paos+xml`和`PAOS: urn:liberty:paos:2003-08;urn:oasis:names:tc:SAML:2.0:profiles:SSO:ecp`)
2. SP发现客户端未经过身份验证,并返回包含PAOS请求的SOAP信封。
3. 客户端负责将其发送到其ECP使用者服务上的适当IdP。
4. IdP向客户端发出身份验证挑战。
5. IdP以另一个SOAP信封的形式返回响应,其中包含其正文中的SAML响应。
6. 客户端必须将此响应发送到SP的ECP / SOAP断言使用者服务。
问题是,所有这些步骤都可以正常工作,直到第6步。在这一步中,响应信封的正文包含一个Destination属性,指向SP的POST断言使用者服务。这个Destination属性由keycloak设置,并且与我想要发送响应的实际ECP服务不匹配。我们使用的SAML库是opensaml,它检查请求URI与此Destination属性是否匹配,如果不匹配,则抛出异常`org.opensaml.xml.security.SecurityException: SAML message intended destination endpoint did not match recipient endpoint`。
我理解为什么会抛出这个异常,但不知道如何配置Keycloak与SP的ECP / SOAP服务。在Keycloak的管理控制台中,我只能配置SSO POST / Redirect和SLO POST / Redirect的URL,但没有关于ECP的信息。
我目前正在配置另一个IdP,但我真的希望确保Keycloak也可以成为我们解决方案的支持服务器。
首先请纠正我,如果我错了,那么ECP流程应该是这样的:
1. 客户端访问SP REST API
- 客户端知道他需要进行身份验证,因此设置所需的ECP标头(`Accept: application/vnd.paos+xml`和`PAOS: urn:liberty:paos:2003-08;urn:oasis:names:tc:SAML:2.0:profiles:SSO:ecp`)
2. SP发现客户端未经过身份验证,并返回包含PAOS请求的SOAP信封。
3. 客户端负责将其发送到其ECP使用者服务上的适当IdP。
4. IdP向客户端发出身份验证挑战。
5. IdP以另一个SOAP信封的形式返回响应,其中包含其正文中的SAML响应。
6. 客户端必须将此响应发送到SP的ECP / SOAP断言使用者服务。
问题是,所有这些步骤都可以正常工作,直到第6步。在这一步中,响应信封的正文包含一个Destination属性,指向SP的POST断言使用者服务。这个Destination属性由keycloak设置,并且与我想要发送响应的实际ECP服务不匹配。我们使用的SAML库是opensaml,它检查请求URI与此Destination属性是否匹配,如果不匹配,则抛出异常`org.opensaml.xml.security.SecurityException: SAML message intended destination endpoint did not match recipient endpoint`。
我理解为什么会抛出这个异常,但不知道如何配置Keycloak与SP的ECP / SOAP服务。在Keycloak的管理控制台中,我只能配置SSO POST / Redirect和SLO POST / Redirect的URL,但没有关于ECP的信息。
我目前正在配置另一个IdP,但我真的希望确保Keycloak也可以成为我们解决方案的支持服务器。