我正在尝试使身份验证脚本正常工作。它由我的公司提供,因为它是他们在其他系统中使用的。我在 chrome 和 firefox v19 之间有一个奇怪的不一致行为(目前在我们的桌面环境中是标准的)。
这个过程非常简单:我们创建一个指向 SAML 服务的 iframe。我有一个 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 调用这样的事件吗?Angular 的ready()
功能会做一些我没想到的事情(不耐烦)吗?
提前致谢!