Dialog API:在Excel Online中重定向后,Dialog无法发送消息

时间:2017-02-09 20:32:39

标签: office-js

我利用对话框API和ADAL.js进行身份验证。对话框代码确定用户是否经过身份验证,并且(使用ADAL.js)导航到具有适当属性的AAD登录页面(如果用户尚未通过身份验证)。当AAD页面完成后,它会重定向回对话框,此时它会识别它已完成并将消息发送回加载项。

然后,加载项关闭对话框并继续其流程,现在可以获取令牌。

直到最近它在Excel Online中点亮时,该对话框才对我们有效。我们最初必须进行一些更改以调整加载顺序,以便ADAL.js代码可以在尝试初始化Office之前处理窗口回调,因为(在Excel中运行时)Office无法在框架ADAL中初始化.js用于获取令牌。我们重构了代码,现在避免在框架时初始化Office。

但是,我们最近发现了另一个只会影响IE和Edge的奇怪问题(Chrome和Firefox工作正常)。出于某种原因,当对话框导航回AAD页面之后,它无法将消息发送回父级。奇怪的是,如果重新加载页面,则可以正常发送消息;在AAD重定向之后不会立即。

我们通过在发送消息后重新加载对话框解决了这个问题,但这似乎是一个应该调查的奇怪问题。下面是我们对话框代码的片段。

var authContext = new AuthenticationContext({
    instance: localStorage.adalConfigInstance,
    clientId: localStorage.adalConfigClientID,
    tenant: (localStorage.adalConfigTenant ? localStorage.adalConfigTenant : "common"),
    cacheLocation: "localStorage",
    redirectUri: window.location.href.replace(window.location.hash, ""),
    displayCall: function (location) {
        if (localStorage.oauthTwoFactorForcedClientID) {
            location = location.replace("response_type=id_token", "response_type=id_token+token") + "&resource=" + localStorage.oauthTwoFactorForcedClientID;
        }
        window.location.replace(location);
    }
});

var initialLoad = localStorage.oauthInitialLogin === "true";
localStorage.oauthInitialLogin = "false";

authContext.handleWindowCallback();

// Only initialize Office if the dialog isn't framed (e.g. not an ADAL token acquisition frame)
if (window.parent === window) {
    Office.initialize = function (reason) {
        $(document).ready(function authenticationDialogLoaded() {
            function login() {
                if (initialLoad) {
                    authContext.login();
                } else {
                    // This modifies the dialog to show login content
                }
            }

            function fail(error) {
                Office.context.ui.messageParent(JSON.stringify({ error: error }));
            }

            function authenticated() {
                Office.context.ui.messageParent("authenticated");
            }

            if (sessionStorage.authenticated) {
                authenticated();
            } else {
                var loginError = authContext.getLoginError();
                if (!initialLoad && loginError) {
                    fail(loginError);
                    return;
                }
                var user = authContext.getCachedUser();
                if (user) {
                    window.setTimeout(function acquireToken() {
                        authContext.acquireToken(localStorage.adalResourceID, function tokenAcquired(error, token) {
                            if (error) {
                                if (initialLoad) {
                                    login();
                                } else {
                                    fail(error);
                                }
                            } else if (!token) {
                                login();
                            } else {
                                authenticated();
                                sessionStorage.authenticated = true;
                                window.setTimeout(function () { window.location.reload(true); }, 0);
                            }
                        });
                    }, 0);
                } else {
                    login();
                }
            }
        });
    };
}

有没有人见过这个/有人意识到这一点吗?

---更新2/21 ---

我们有来自其他受支持产品的客户表示他们无法在线验证。我重试了我们的刷新"解决方案今天,它不再有效。我们似乎无法在当前状态下在线利用对话API,因此我在我们的身份验证代码中添加了一种解决方法,以便在线运行时弹出一个窗口,无论对话API如何支持。

0 个答案:

没有答案