spring - 带有 OKTA 的 Spring SAML SSO - 更改 Web 应用程序上下文时的 InResponseTo
问题描述
OKTA SAML SSO 与 Spring Security 的集成遇到了很多麻烦。我们正在使用saml-dsl
Spring Security 的扩展来配置身份验证,并且在 HTTP 上一切正常,但是当我们尝试使用 HTTPS 时,身份验证仅在应用程序部署在根 ( /
) 上下文中时才有效。当我们将上下文更改为其他任何内容时,它会停止工作并开始抛出InResponseTo
字段错误,有时使用不同的配置会导致重定向循环。
这是我们正在使用的配置:
http
.csrf()
.disable();
http
.sessionManagement().sessionFixation().none();
http
.logout()
.logoutSuccessUrl("/");
http
.authorizeRequests()
.antMatchers("/saml*").permitAll()
.anyRequest().authenticated()
.and()
.apply(samlConfigurer())
.serviceProvider()
.keyStore()
.storeFilePath(config.getKeystorePath())
.password(config.getKeystorePassword())
.keyname(config.getKeyAlias())
.keyPassword(config.getKeystorePassword())
.and()
.protocol("https")
.hostname(String.format("%s:%s", serverURL, config.getServerPort()))
.basePath("/"+contextRoot)
.and()
.identityProvider()
.metadataFilePath(config.getMetadataUrl());
我们也应该正确设置 OKTA(https://localhost:8443/ourappcontext/saml/SSO 用于测试,所有其他的东西也一样)
我们已经尝试了这里提出的大多数解决方案和 Spring 文档(空工厂、spring 会话管理和会话固定等),但似乎没有任何效果。我们做错了什么吗?我们目前没有生成任何 SP 元数据,这可能是错误的,并且请求以某种方式重定向到错误的地方或其他什么?到目前为止真的很困惑,第一次使用 SAML,我不确定它是扩展、OKTA 配置还是 Spring 配置......
我们在 Wildfly 上进行部署,您可以通过单独的 jboss-web.xml 在其中设置应用程序上下文,如果这很重要的话。
解决方案
默认情况下HttpSessionStorageFactory
使用,这提供了HttpSessionStorage
SAML 消息存储。
--> HTTP 会话 cookie 是服务器端 SAML 消息存储的浏览器端密钥。
当 SAML 响应传递给 Spring Security SAML SP 时浏览器未发送 HTTP 会话 cookie 时,它无法找到相关的 SAML AuthNRequest,并且无法将“InResponseTo”值与匹配 AuthNRequest 的“ID”值进行比较。
如果你不能保证 HTTP 会话 cookie 被传递,你可以实现你自己的SAMLMessageStorageFactory
和SAMLMessageStorage
(就像我做的那样)。
推荐阅读
- angular - 有没有办法将现有的 Angular 应用程序连接到另一个 nativescript 应用程序(角度)?
- android - 新的安卓应用在旧手机上运行良好,但在新手机上却不行
- c - 奇怪的 C 行为
- r - 在 Google Colab 中保存 R 输出
- go - 为什么指针类型可以访问嵌入类型的所有方法
- mongodb - 是否可以在特定时间后更改 MongoDB 文档字段值?
- string - 如何在 bash 中添加带有整数的字符串?
- sql - 如何在 GROUP BY 和 ORDER BY 中使用多列但只有一列
- python - 以逗号分隔的选项
- python - Kivy 切换按钮仅打开/关闭声音一次