当前位置: 首页 > 知识库问答 >
问题:

使用Spring Security SAML向SAML请求添加请求参数

周翰
2023-03-14

有什么建议吗?

共有1个答案

欧阳嘉年
2023-03-14

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一章。

<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>
 类似资料:
  • 问题内容: 我有一个尝试发送的HTTP GET请求。我尝试通过首先创建一个对象并将参数添加到该对象,然后调用我的对象,来将参数添加到此请求中。此方法失败。但是,如果我手动将参数添加到URL中(即append ),它将成功。 我知道我在这里缺少任何东西,任何帮助将不胜感激。 问题答案: 我使用NameValuePair和URLEncodedUtils列表创建所需的url字符串。

  • 问题内容: Retrofit 2的文档说: 可以使用OkHttp拦截器指定需要添加到每个请求的标头。 使用以前的版本以下是相关的质量检查)可以轻松完成此操作。 但是,使用改型2,我找不到类似的东西或方法,其可应用于对象。 此外,它似乎没有在OkHttp了。Retrofit的文档向我们介绍了Interceptor,我不太了解如何将其用于此目的。 我怎样才能做到这一点? 问题答案: OkHttpCli

  • 我使用的是Swagger 2.0和Swagger UI 3.0.3。 在我的api_定义中。yaml在我的路径之前有以下内容: 这将在Swagger UI中添加一个授权按钮,用户可以在其中粘贴他们的API密钥。我希望此API密钥在每个请求的请求标头中发送。但这不会发生,我不确定为什么。我错过了什么吗? 编辑: 请求似乎发出了,我回来了。 Chrome开发工具显示以下请求头: 我有路径设置为: 定义

  • 我有一些超文本传输协议请求参数,我需要添加作为sping-sleuth中的传播密钥。 注意:我知道spring-sleuth默认添加标头。我也需要注入超文本传输协议请求Patameter。 任何帮助都将被告知。

  • 作为服务提供商(SP),我正在尝试使用URL重定向流创建SLO请求。在阅读了很多文章后,这就是我想出的: 创建一个注销请求xml并对其进行数字签名 将请求xml转换为base64 url编码字符串 将base64编码的请求xml作为查询字符串附加到SLO url 将页面重定向到上述构造的url(IDP) 然后IDP将在其结束时为所有SP执行必要的SLO步骤并重定向回我们当前的应用程序(发起SLO请

  • 可以在模板中直接使用$Request对象,直接输入它的属性或调用它的大部分方法,但只支持方法的第一个参数; // 调用Request对象的get方法 传入参数为id {$Request.get.id} // 调用Request对象的param方法 传入参数为name {$Request.param.name} // 调用Request对象的param方法 传入参数为post.post_title