Spring SAML - 如何在 SP HTTP 请求上添加自定义字段?

Posted

技术标签:

【中文标题】Spring SAML - 如何在 SP HTTP 请求上添加自定义字段?【英文标题】:Spring SAML - how to add custom fields on the SP HTTP request? 【发布时间】:2014-10-27 03:01:01 【问题描述】:

我的服务提供商使用 HTTP-Post 绑定将请求发送到 IDP。我需要在表单中添加新字段。现在我正在发送“SAMLRequest”和“RelayState”,但我还需要发送“option”和“profile”,这些是我们的 IDP 所需的字段。如何使用 Spring Saml 安全性来实现这一点?

【问题讨论】:

【参考方案1】:

您可以在 SAML AuthnRequest 消息的 Extensions 元素中包含其他字段。为此,您需要覆盖类WebSSOProfileImpl 并在securityContext.xml 中配置新的实现类。 Extensions 元素可以这样构造:

package example;

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.metadata.MetadataManager;
import org.springframework.security.saml.processor.SAMLProcessor;
import org.springframework.security.saml.websso.WebSSOProfileImpl;
import org.springframework.security.saml.websso.WebSSOProfileOptions;

/**
 * Customization of the AuthnRequest generation.
 */
public class WebSSOProfile extends WebSSOProfileImpl 

    public WebSSOProfile() 
    

    public WebSSOProfile(SAMLProcessor processor, MetadataManager manager) 
        super(processor, manager);
    

    @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 extraElement = new XSAnyBuilder().buildObject("urn:myexample:extraAttribute", "ExtraElement", "myexample");
        extraElement.setTextContent("extraValue");

        Extensions extensions = new ExtensionsBuilder().buildObject();
        extensions.getUnknownXMLObjects().add(extraElement);

        return extensions;

    


【讨论】:

知道如何在 Grails 应用程序中执行此操作吗?我需要重写 WebSSOProfileImpl.buildReturnAddress 方法。

以上是关于Spring SAML - 如何在 SP HTTP 请求上添加自定义字段?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Security SAML 示例中配置 IDP 元数据和 SP 元数据?

如何使用 SP 密钥库 spring saml 中的证书

在 Spring SAML 中指定 IDP 和 SP 的加密算法

使用 Spring Security saml 的 IDP 会话超时

在反向代理后面使用 SP 时出现 Spring saml 问题

使用 Spring SAML 作为 IDP 而不是 SP