如何在嵌入式iframe中使用SimpleSAMLphp进行身份验证

问题描述

我们拥有一个完全内部开发的平台,该平台使用SimpleSAMLPHP来验证可能使用从Azure AD到G-Suite的客户的用户身份。可以共享页面,使我们的客户可以将页面的iframe版本嵌入他们选择的平台中。

问题在于,由于具有相同的x-frame-options和跨域iframe安全性,Microsoft和Google不再允许其登录页面显示在iframe中。

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

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

解决方法

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

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页面将调用onunload <body onunload="closewin()">函数,该函数将关闭窗口。

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...