我利用对话框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如何支持。