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

SP中具有不同二级域的多个AssertionConsumerService

荆弘伟
2023-03-14

我正在用spring security saml扩展实现一个多租户应用程序。

我为每个租户提供了一个服务提供商(SP)。所有SP都运行在与SP特定的第二级域公开的同一服务器上:

  • sp1。myapp。com/myapi/1/

在每个SP元数据文件中,我都配置了特定于租户的AssertionConsumerService。

当我测试SSO登录时,当SP端收到身份提供者(IDP)的响应时,我会得到一个KO。在原木一侧,我只看到:

ERROR [BaseSAMLMessageDecoder] SAML message intended destination endpoint 'https://sp1.myapp.com/myapi/saml/SSO' did not match the recipient endpoint 'https://default.myapp.com/myapi/saml/SSO'

其中'https://default.myapp.com/myapi/saml/SSO'是设置为负载均衡器上下文提供程序的serverName的URL:

<bean id="lbContextProvider" class="org.springframework.security.saml.context.SAMLContextProviderLB" init-method="afterPropertiesSet">
    <property name="metadata"    ref="metadata" />
    <property name="keyManager"  ref="keyManager" />
    <property name="scheme"      value="https" />
    <property name="serverName"  value="default.myapp.com" />
    <property name="contextPath" value="/myapi" />
    <property name="serverPort"  value="443" />
    <property name="includeServerPortInRequestURL" value="true" />
</bean>

在docs.spring.io/spring-security-saml我看到

服务提供者现在可以使用相同的绑定定义多个断言使用者endpoint

  • 如何配置它
  • 它是否与负载平衡器上下文提供程序冲突
  • 我可以为不同的二级域提供多个AssertionConsumerService而不再现此冲突吗
  • 这个问题似乎用LB解决了,但谁知道我是否可以向负载平衡器上下文提供程序提供多个serverName(可能是动态选择)
  • 按照第13章文档的建议,禁用InResponseToField的检查。Springio/Spring Securitysaml,针对这个问题
  • 按照此问题的建议,配置successRedirectHandler的defaultTargetUrl(其中我使用的自定义超类为org.springframework.security.web.authentication.SimpleRuthenticationSuccessHandler)。此外,该溶液不是多租户
<bean id="successRedirectHandler" class="org.MySamlAuthenticationSuccessHandler" 
                            init-method="afterPropertiesSet">
    <property name="contextPath" value="/myapi" />
    <property name="defaultTargetUrl" value="https://default.myapp.com/myapi/saml/SSO"/>
    <property name="requireProxyWrapping" value="false"/>
</bean>

共有1个答案

蒋无尘
2023-03-14

通过扩展SamlContextProviderLB自定义SAMLContextProviderLB。

自定义类中,添加构造函数并使用默认值初始化。

重写getLocalAndPeerEntity/getLocalEntity/populateLocalEntityId。在每个方法中,根据requestURL中的域设置lbDomain。

上述方法对我有效。

 类似资料:
  • 我正在为多种产品开发集中式管理模块。尝试跨多个产品维护同一会话。 对于Product1:验证成功并在响应标头中发送令牌 请求网址:http://localhost:8080/admin-web/rest/authenticate/ 请求标头

  • 我有一个有两个阶段的Dockerfile;第一阶段从源代码构建一个react应用程序,第二阶段复制构建并添加一个NGINX服务器: 我也在使用gitlab-ci,我希望有多个阶段:构建、测试和部署。但是我不知道如何将构建和测试阶段分开,因为我使用的是多阶段的DockerFile。问题是所有的JS测试(对于React)都需要在“Yarn build”执行之前运行,并且build被复制到seconds

  • 问题内容: 在Django中,我将SESSION_COOKIE_DOMAIN设置为我的域名。但是我实际上想使用两个不同的域名来运行同一站点。 在设置了SESSION_COOKIE_DOMAIN的情况下,只有命名域才允许用户登录。是否可以同时允许两个域登录? 问题答案: 如果你将会话cookie域设置为以“。”开头。字符,它将使你能够处理通配符子域并在多个子域之间共享会话cookie(登录会话)。

  • 问题内容: 我运行foo.com。我在foo.com中有两个不同的应用程序:一个是foo.com/bar,另一个是foo.com/example。我使用会话来跟踪有关用户登录的信息,但是如果用户从foo.com/bar转到foo.com/example,则foo.com/example会看到用户从foo.com/启动的会话并使用该信息。我的问题是,如何同时为每个目录进行两个不同的会话? 问题答案:

  • 问题内容: 我遇到的情况是可以从多个不同的域访问应用程序。例如, foo.com 和 bar.com 在理论上都可以指向我的应用程序。此外,它们的子域也可以指向我的应用程序,例如 red.foo.com 和 blue.foo.com 。我正在使用Express cookie会话,该会话的初始化代码如下所示: 当用户访问 foo.com 或其任何子域时,这种方法效果很好,但是 bar.com 无法正

  • 问题内容: 我创建了一个小部件,该小部件显示一个简单的textview,可在配置活动中将其作为Edittext编辑。我将输入的文本与共享的首选项一起保存,因此用户可以点击小部件来编辑文本,并且已经输入的文本将出现在edittextfield中。我的问题是这个。我希望用户能够添加多个窗口小部件,但是当添加第二个窗口小部件时,将从共享首选项中加载与其他窗口小部件中相同的文本。并且,当在widget上被