如何配置Okta使其正确重定向带哈希片段的参数化URL?
Okta SAML认证重定向丢失哈希片段解决方案
根本原因
URL 中 # 开头的哈希片段属于浏览器端专属内容,不会随任何HTTP请求发送到服务器,因此Apache、Mellon插件、Okta服务端均无法获取该部分参数。你在Okta登录页URL上看到的哈希仅为浏览器本地留存,登录请求提交时该部分内容不会被Okta后端接收,自然无法存入SAML的RelayState参数中,导致登录完成跳转后哈希丢失。
可行解决思路
方案1:浏览器端存储哈希后转换(无需调整SAML配置,可自行实现)
- 在
Default.php页面加载且未触发Mellon认证重定向前,执行以下JS逻辑:- 读取当前URL的哈希值,存入
localStorage,示例:localStorage.setItem('saml_redirect_hash', window.location.hash) - 也可直接将哈希值转为查询参数拼到当前URL的search部分,比如将
https://docs.example.com/docs/version/Default.php#cshid=readme重定向为https://docs.example.com/docs/version/Default.php?cshid=readme,此时查询参数会被服务端正常接收并带入RelayState
- 读取当前URL的哈希值,存入
- 完成SAML认证跳转回
Default.php后,执行对应恢复逻辑:- 如果之前用了localStorage存储,读取
localStorage.getItem('saml_redirect_hash'),如果存在则赋值给window.location.hash,同时清除存储的哈希值 - 如果之前转成了查询参数,读取URL的
cshid查询参数,拼接为哈希值后移除该查询参数即可
- 如果之前用了localStorage存储,读取
- 哈希恢复完成后再执行原本跳转到
content/readme.php的逻辑即可
方案2:调整Mellon与Okta的RelayState透传配置(需对接配置人员)
如果已经采用了将哈希转查询参数的方案但仍然丢失参数,可让配置人员检查以下配置:
- 确认Apache Mellon插件的
MellonRelayState相关配置开启了完整URL透传,未限制仅透传固定路径 - 确认Okta应用配置中SAML设置的RelayState透传功能开启,未设置固定的默认RelayState覆盖请求传入的参数
- 确认SAML请求中的RelayState参数已正确编码,特殊字符不存在转义错误
方案3:调整重定向逻辑时序(可自行调整PHP代码实现)
修改redirect.php的逻辑,在生成带哈希的跳转链接前,先判断用户是否已完成SAML认证:
- 如果用户已认证,直接走原有带哈希的跳转逻辑即可
- 如果用户未认证,先引导用户完成SAML认证,认证完成后再执行带哈希的跳转逻辑,避免哈希在认证流程中被丢失
内容的提问来源于stack exchange,提问作者Paul Pehrson
相关产品推荐
相关产品推荐

