我们部署了一个 Discourse 实例,并配置了 SSO(使用 SAML/Shibboleth),同时设置允许在另一个同样使用相同 SSO 的子域名上嵌入内容。
以下是我遇到的问题:
- 用户访问子域名 X 上的一个页面,该页面嵌入了托管在子域名 Y 上的 Discourse 主题。
- 用户被重定向到子域名 Z 进行 SSO 登录,随后又被重定向回子域名 X。
- 子域名 X 上的页面加载 JavaScript 嵌入文件,该文件创建一个 iframe 以尝试加载论坛主题。然而,Discourse(子域名 Y)将 iframe 重定向到子域名 Z 进行 SSO。由于用户已经登录,系统会将其重定向回 Discourse 嵌入 URL。但这会导致 400“嵌入错误”,因为此时 Referer URL 来自子域名 Z(SSO 子域名),而不是子域名 X(已批准/列入白名单用于嵌入的域名)。Discourse 返回的消息是:“Referer 未发送,或与以下任何主机不匹配”。
- 刷新页面后,一切正常工作(即论坛主题成功加载),这可能是因为浏览器现在拥有有效的会话 Cookie,从而无需再重定向到 SSO 子域名。
有什么方法可以彻底解决这个问题吗?目前我设置了一个非常糟糕的变通方案:首先尝试将论坛主题加载到一个隐藏的 iframe 中,然后等待 1 秒,再将其加载到用户可见的实际页面中。
任何帮助或建议都将不胜感激!