我正在尝试使用身份验证脚本。它由我公司提供,因为它是他们在其他系统中使用的。我在chrome和firefox v19之间存在奇怪的不一致行为(目前我们桌面环境中的标准是什么)。
这个过程非常简单:我们创建一个iframe,它指向SAML服务。我有一个angularJS SPA正在等待SAML服务使用JSON对象进行响应,该对象将告诉我的应用程序用户是否经过身份验证。然后我们运行我们的应用程序(使用angular.bootstrap(document, ['mySPA']);
或者在未经授权的情况下执行其他操作。
有问题的代码是:
(function createIframe() {
var iframe = document.createElement("iframe");
setAttributes(iframe, {
"name": "auth",
"id": "myFrame",
"src": "https://api.SAML2AuthService",
"height": "0",
"width": "0",
"border": "0"
});
document.body.appendChild(iframe);
// Create IE + others compatible event handler
authEventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
authEvent = window[authEventMethod];
authMessageEvent = authEventMethod == "attachEvent" ? "onmessage" : "message";
})();
// Listen to auth iframe message
authEvent(authMessageEvent, function (e) {
var authorized = false;
for (var i = 0; i < 2; i++) {
Authentication = Auth.getInstance();
if (e.data !== null) {
data = e.data;
if (data.isAuthorized === "true" && data.authorizationToken !== null) {
Authentication.isAuthorized = e.data.isAuthorized;
Authentication.principal = e.data.principal;
Authentication.description = e.data.description;
Authentication.authorizationToken = e.data.authorizationToken;
authorized = true;
break;
}
}
}
if (!authorized) {
console.log("Unauthorized");
}
}, false);
然后,我们打电话给:
angular.element(document).ready(function() {
angular.module( 'mySPA', []
...
});
angular.bootstrap(document, ['associateDesktop']);
});
但是,由于我无法控制的原因,SAML服务会执行重定向以获取实际凭据。我的浏览器的调试控制台将这些显示为HTTP状态302,然后(我假设)重定向并以HTTP状态200的形式返回给我。
具体来说,我的问题是我附加到窗口的AuthEvent
事件并不总是被解雇。在chrome中,如果我清除所有浏览数据(cookie等),authEvent
会触发,我会按照我的预期进行身份验证(或不进行身份验证)。在Firefox中,如果我清除所有缓存数据,authEvent
永远不会被解雇。我把事件附加错了吗? Firefox不会为302调用这样的事件吗?角度ready()
功能是否会做我不期望的事情(不耐烦)?
提前致谢!
答案 0 :(得分:0)
这个相同的代码现在可以在FF 19中运行。我没有改变任何东西,我最终发现事后服务正在返回一些略有错误的数据,显然chrome能够优雅地处理,但firefox没有。那个格式错误的数据已经修复,所以现在代码可以工作了。我无法再访问发送到浏览器的原始(据称是坏的)内容,因此我无法在此处发布以显示有用的错误和解决方案。
但是,我想至少记录上面的代码工作正常,并在这里发布一个更简单的版本,所以任何寻找可以使用的代码的人都会有所作为。对不起,我无法更好地回答实际问题。
家长html
<html>
<script>
var authEvent = function(event) {
// debugger;
var div = document.getElementById("response");
div.innerHTML = event.data.message;
};
if (window.addEventListener) {
window.addEventListener("message", authEvent, false);
}
else {
window.attachEvent("onmessage", authEvent);
}
</script>
<body>
<iframe src="frame.html"></iframe>
<br /><br /><br />
<div id="response">No response...</div>
</body>
iFrame html
<!DOCTYPE html>
<html>
<head>
<title>test</title>
<script>
var authResponse = {
"message": "Iframe called parent successfully!"
};
window.onload = function() {
parent.postMessage(authResponse,"*");
};
</script>
</head>
<body>
Child iFrame....
</body>
</html>