0

我正在尝试使身份验证脚本正常工作。它由我的公司提供,因为它是他们在其他系统中使用的。我在 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()功能会做一些我没想到的事情(不耐烦)吗?

提前致谢!

4

1 回答 1

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>
于 2014-03-05T18:04:21.993 回答