0

我们有一个完全内部开发的平台,它使用 SimpleSAMLphp 来验证我们客户的用户,这些用户可能使用从 Azure AD 到 G-Suite 的任何东西。页面可以共享,允许我们的客户在他们选择的平台中嵌入页面的 iframe 版本。

问题在于,由于同源 X-Frame-Options 和跨域 iframe 安全性,Microsoft 和 Google 不再允许他们的登录页面出现在 iframe 中。

嵌入 URL 包含一个加密的组织标识符,以便我们知道将它们定向到哪个身份验证平台,但 SimpleSAMLphp 将它们重定向到 MS 或 Google 登录页面并且无法加载。

如何在跨域 iframe 中使用 SimpleSAMLphp 进行身份验证?

4

1 回答 1

0

答案是向用户提供一个按钮,该按钮将在自己的新窗口中打开标准登录页面。因此绕过了跨浏览器的安全性。

var mywin;
function login() {
    mywin = window.open("https://my.login.page", "my_win_name", "height=600,width=600");
}
function closewin() {
    mywin.close();
}
<button type="button" onclick="login()">Login</button>

此页面使用 SimpleSAMLphp 执行登录,然后设置身份验证$_COOKIE,使用 重新加载它的开启程序window.opener.location.reload()。然后 iframed 页面调用一个<body onunload="closewin()">关闭窗口的函数 onunload。

我发现这是最有用的方法。调用登录窗口onload偶尔会引起安全警报,因此用户启动的按钮似乎是最合适的。在重新加载后,新窗口也会自行关闭opener,用户在短时间内什么都看不到。由于 iframed 页面可以访问打开的窗口,因此只有等到它重新加载才能关闭窗口才有意义,因此onunload. 随后,如果有人在登录完成之前手动重新加载或导航离开 iframe 的内容,相应的窗口也会关闭。

于 2020-10-07T14:18:15.187 回答