java - SAML DNS 解析问题

标签 java spring-security spring-saml

我们有一个使用 Spring SAML 扩展的应用程序,我们已将其设置为一个 SP,可以在本地主机上针对 SSOCircle 运行。我们现已在客户的测试环境中进行了部署,并正在尝试使其与客户的 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 的任何端点 URL 都不匹配:SSO:浏览器

在浏览器窗口中,我们看到请求发送至 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

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

最佳答案

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

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

<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 认为它部署在特定的公共(public) 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 中找到更多详细信息.

关于java - SAML DNS 解析问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26939101/

相关文章:

java - 重新部署应用程序时创建的新日志和锁定文件

java - 转义 XML 字符而不转义 CDATA 标记

spring - 如何获取内部 Spring 对象的实例

spring-security - 当与 "isAuthenticated()"一起使用时,Spring Security 的 "hasRole()"表达式真的有必要吗?

java - Spring security saml 中的代理设置

spring - 即使在 IDP 使用 SAML 成功登录后,获取身份验证对象也为空

java - 在 EAR 项目中,EJB 在部署时出现两次

java - 如何在生产服务器上使用 java 在新窗口中打开 URL

java - 用户登录后如何在 Controller 中获取 session 数据

saml - Spring SAML : how to push the requested URL to SAML as RELAY_STATE?