SAML 提供了一种标准机制来扩展身份验证请求中发送的内容 -Extensions
元素。
为了使用它,您需要与您的 IDP 协调您发送的数据类型和格式。在 Spring SAML 中,您可以通过扩展类来自定义其内容WebSSOProfileImpl
,例如这样:
package com.v7security.saml;
import org.opensaml.common.SAMLException;
import org.opensaml.saml2.common.Extensions;
import org.opensaml.saml2.common.impl.ExtensionsBuilder;
import org.opensaml.saml2.core.AuthnRequest;
import org.opensaml.saml2.metadata.AssertionConsumerService;
import org.opensaml.saml2.metadata.SingleSignOnService;
import org.opensaml.saml2.metadata.provider.MetadataProviderException;
import org.opensaml.xml.schema.XSAny;
import org.opensaml.xml.schema.impl.XSAnyBuilder;
import org.springframework.security.saml.context.SAMLMessageContext;
import org.springframework.security.saml.websso.WebSSOProfileImpl;
import org.springframework.security.saml.websso.WebSSOProfileOptions;
/**
* Class adds additional extensions element to the AuthnRequest sent to IDP.
*/
public class WebSSOProfile extends WebSSOProfileImpl {
@Override
protected AuthnRequest getAuthnRequest(SAMLMessageContext context, WebSSOProfileOptions options, AssertionConsumerService assertionConsumer, SingleSignOnService bindingService) throws SAMLException, MetadataProviderException {
AuthnRequest authnRequest = super.getAuthnRequest(context, options, assertionConsumer, bindingService);
authnRequest.setExtensions(buildExtensions());
return authnRequest;
}
protected Extensions buildExtensions() {
XSAny languageClass = new XSAnyBuilder().buildObject("http://www.v7security.com/schema/2015/04/request", "RequestLanguage", "req");
languageClass.setTextContent("urn:v7security:request:lang:english");
Extensions extensions = new ExtensionsBuilder().buildObject();
extensions.getUnknownXMLObjects().add(languageClass);
return extensions;
}
}
另一种选择是将数据发送到relayState
,这是 SP 可以发送给 IDP 并期望其被退回的一条信息(通常是 SP 的状态)。该值对 IDP 来说应该是不透明的,但它当然可以按照您想要的方式处理它。有关设置继电器状态的详细信息,请参见手册中有关 SP 初始化 SSO 的章节.
设置请求参数HttpRequest
对象预计不会产生任何结果,Spring SAML 不会以任何方式自动传达这些结果。
可以通过扩展类向使用 HTTP 重定向绑定发送的请求添加 HTTP 参数HTTPRedirectDeflateEncoder
和重写方法buildRedirectURL
。然后可以将新类提供给构造函数HTTPRedirectDeflateBinding
并替换为beanredirectBinding
of securityContext.xml
,通过以下方式:
<bean id="redirectBinding" class="org.springframework.security.saml.processor.HTTPRedirectDeflateBinding">
<constructor-arg>
<bean class="org.opensaml.saml2.binding.decoding.HTTPRedirectDeflateDecoder">
<constructor-arg name="pool" ref="parserPool"/>
</bean>
</constructor-arg>
<constructor-arg>
<bean class="com.custom.HTTPRedirectDeflateEncoder"/>
</constructor-arg>
</bean>