【问题标题】:Spring Security with Okta & custom redirect == Too Many Redirects带有 Okta 和自定义重定向的 Spring Security == 重定向太多
【发布时间】:2021-12-30 10:58:51
【问题描述】:

使用自定义重定向 URL 配置 Spring 安全性时,该 URL 使用此处记录的基本 URI 模板变量:https://docs.spring.io/spring-security/site/docs/5.2.12.RELEASE/reference/html/oauth2.html#oauth2Client-auth-code-redirect-uri

应用程序进入过多重定向的循环。

此配置有效: spring.security.oauth2.client.registration.okta.redirect-uri={baseUrl}/login/oauth2/code/{registrationId}

这不会: spring.security.oauth2.client.registration.okta.redirect-uri={baseScheme}://{baseHost}{basePort}{basePath}/login/oauth2/code/{registrationId}

由于证书和负载均衡器以及所有这些,我们需要欺骗 spring 重定向到运行它的 https 和 http。所以我们需要修改baseScheme。

使用基本 URL,从浏览器我们看到以下循环:

  • 用户访问应用网址:https://MyApp
  • 被重定向到 Okta 以使用与应用匹配的重定向 url 登录
  • 使用来自 Okta 的代码重定向回应用程序
  • 被重定向到他们正在寻找的 MyApp 中的页面

将redirect-url与baseScheme一起使用,循环是:

  • 用户访问应用网址:https://MyApp
  • 被重定向到 Okta 以使用与应用匹配的重定向 url 登录
  • 使用来自 Okta 的代码重定向回应用程序
  • 被重定向到 MyApp/oauth2/authorization/okta
  • 被重定向到 Okta
  • 使用来自 Okta 的不同代码重定向回应用程序
  • 被重定向到 MyApp/oauth2/authorization/okta
  • 被重定向到 Okta
  • 使用来自 Okta 的不同代码重定向回应用程序
  • 被重定向到 MyApp/oauth2/authorization/okta
  • 直到它崩溃。

我们可能会错过什么设置?为什么 Spring 会转到 /oauth2/authorization/okta 而不是他们开始调用的原始页面?

注意:从 Okta 重定向回应用程序的说明:两个设置都是完全相同的重定向 URL: .../login/oauth2/code/okta?code=...

我的结论是:设置重定向 URL 会正确调用 Okta,但会影响应用程序如何响应重定向调用。

当调试打开时,这里是一个工作调用堆栈:

  • 12二○二一年十一月一十九日:59:21.690 DEBUG 7400 --- [NIO-8080-EXEC-4] ossecurity.web.FilterChainProxy:固定GET /登录/的oauth2 /代码/ 1563码= Es23ULHG3psIXKE3fSk8vaiCITMiAKozHj4KU72n5K4&状态= 0w_8uffbbnhb5VNT31W4J2pvd1hE1f3_qSpOMA5_h7c %3D
  • 2021-11-19 12:59:21.690 调试 7400 --- [nio-8080-exec-4] s.s.w.c.SecurityContextPersistenceFilter :将 SecurityContextHolder 设置为空 SecurityContext
  • 2021-11-19 12:59:22.855 DEBUG 7400 --- [nio-8080-exec-4] .s.ChangeSessionIdAuthenticationStrategy:从 32A94CBEB8BB3474FC1FE355F283A3CD 更改了会话 ID

当它不工作时:

  • 2021-11-19 12:55:37.359 调试 1240 --- [nio-8080-exec-5] ossecurity.web.FilterChainProxy:保护 GET /login/oauth2/code/okta?code=khASdiRxOdJk24dMALJDyfzlAWy-ilvAP_qlmTB0J8k&state =le1Ddql8ZXmajKD6XwbLi-c42k_-H6MfrlVhHi4Gyhw%3D
  • 2021-11-19 12:55:37.359 调试 1240 --- [nio-8080-exec-5] s.s.w.c.SecurityContextPersistenceFilter :将 SecurityContextHolder 设置为空 SecurityContext
  • 2021-11-19 12:55:37.359 调试 1240 --- [nio-8080-exec-5] os.s.w.a.AnonymousAuthenticationFilter :将 SecurityContextHolder 设置为匿名 SecurityContext

【问题讨论】:

  • 之前好像出现过这个错误:stackoverflow.com/questions/32009738/…。但是那个问题OP没有说明错误的配置是什么。跟踪显示此错误:“HttpSessionRequestCache : Did not match request /login/oauth2/code/okta?co...”
  • 挖掘更多,这实际上是“真正的”错误: OAuth2LoginAuthenticationFilter : Did not match request to Ant [pattern='{baseScheme}://{baseHost}{basePort}{basePath}/login/ oauth2/code/{registrationId}']

标签: java spring-security okta


【解决方案1】:

这个有几个问题。

首先,您不需要“愚弄” Spring 来了解您的应用是 https 还是 HTTP。我猜你是在反向代理后面运行,只要确保设置了正确的 X-Forwarded-* 标头即可:

https://docs.spring.io/spring-boot/docs/current/reference/html/howto.html#howto.security.enable-https

对于“重定向过多”问题,这通常是应用程序端的配置错误(我猜是无效的客户端 ID、客户端密钥或颁发者。

经常发生的情况是您的应用程序重定向到 IdP (Okta),IdP 对用户进行身份验证,然后重定向回您的应用程序。

然后,您的应用程序向 IdP 发出反向通道请求以验证用户的身份验证(通过交换 code)。如果此交换失败,您将被重定向回 IdP,但用户已经登录 (SSO),因此它会将您发送回您的应用程序(然后循环往复)。

Spring Security 的默认日志记录有点稀疏(有意地),但它使捕获这样的事情变得困难,提高日志级别:logging.level.com.springframework.security=DEBUG,你应该开始在你的日志文件。

【讨论】:

  • 也有可能是权限错误。例如,如果您的用户已通过身份验证,但没有在您的端点上配置权限(范围、角色或授予权限)。
猜你喜欢
  • 2023-03-10
  • 2021-05-19
  • 2020-10-04
  • 2015-03-27
  • 2021-01-26
  • 2015-09-12
  • 1970-01-01
  • 2015-06-23
  • 2020-08-28
相关资源
最近更新 更多