【问题标题】:SAML DNS Resolution IssueSAML DNS 解析问题
【发布时间】:2024-01-05 17:29:01
【问题描述】:

我们有一个使用 Spring SAML 扩展的应用程序,并且我们已将其设置为一个可以在 localhost 上针对 SSOCircle 运行的 SP。我们现在已经在客户的测试环境中进行了部署,我们正在努力让它与客户的 IDP 一起工作。

我们将元数据提供给 IDP,用 http://myapp-test.acme.com:8080/myapp/saml/SSO 代替 http://localhost:8080/myapp/saml/SSO

身份验证后,我们在日志中看到:

o.s.s.s.m.MetadataGeneratorFilter - 根据第一个服务器请求中的值生成默认实体基 URL http://someappserver.acme.com:8080/myapp

org.opensaml.common.SAMLException:预期目的地 http://myapp-test.acme.com:8080/myapp/saml/SSO 与配置文件 urn:oasis:names:tc:SAML:2.0:profiles:SSO:browser 的任何端点 URL 都不匹配

在浏览器窗口中,我们看到请求转到http://someappserver.acme.com:8080/myapp/saml/SSO

所以http://myapp-test.acme.com:8080/myapp/saml/SSO 解析为

http://someappserver.acme.com:8080/myapp/saml/SSO

我们如何更改我们的代码/配置来处理这个问题?我认为我们不应该将元数据硬编码到应用服务器。

【问题讨论】:

    标签: java spring-security spring-saml


    【解决方案1】:

    服务提供商元数据中的 URL 必须对应于您的服务提供商从 IDP 接收 SAML 消息的真实 URL。在这种情况下,两者不同。

    您可以通过提供属性 entityBaseURL 来更新您的 securityContext.xml 并更改 bean metadataGeneratorFilter,并提供正确的 URL,例如:

    <bean id="metadataGeneratorFilter" class="org.springframework.security.saml.metadata.MetadataGeneratorFilter">
        <constructor-arg>
            <bean class="org.springframework.security.saml.metadata.MetadataGenerator">
                <property name="entityBaseURL" value="http://myapp-test.acme.com:8080/myapp"/>
            </bean>
        </constructor-arg>
    </bean>
    

    如果不设置此属性,Spring SAML 会定义 entityBaseURL 并根据它收到的第一个请求生成元数据。如果您的应用程序在多个 URL 上可用,这当然可以是与您的 IDP 实际发送消息的 URL 不同的 URL。

    如果应用程序服务器看到的内部 URL 与调用者使用的 URL 不同(如 DNS 解析的情况),您可以通过更改 bean 强制 Spring SAML 认为它部署在特定的公共 URL 后面contextProvider到:

    <bean id="contextProvider" class="org.springframework.security.saml.context.SAMLContextProviderLB">
        <property name="scheme" value="http"/>
        <property name="serverName" value="myapp-test.acme.com"/>
        <property name="serverPort" value="8080"/>
        <property name="includeServerPortInRequestURL" value="true"/>
        <property name="contextPath" value="/myapp"/>
    </bean>
    

    您可以在 Spring SAML 手册章节Reverse proxies and load balancers 中找到更多详细信息。

    【讨论】: