Azure 活动目录 javascript 库上的单点登录问题

issue with single sign on Azure active directory javascript library

我们为我们的 MS Dynamics 365 CRM 实例启用了单点登录,以调用 Azure 中托管的 API。在启动 CRM 时,我们执行以下 JavaScript。这在大多数情况下都有效,但有时我们会收到 "Invalid argument" 弹出窗口。我对使用 Adal.js 比较陌生,不知道是什么原因造成的。任何故障排除技巧表示赞赏。提前致谢。

config = {
    ApiUrl: configData["ApiUrl"],
    SubscriptionKey: configData["SubscriptionKey"],
    trace: configData["trace"],
    AcceptHeader: configData["AcceptHeader"],
    ContentTypeHeader: configData["ContentTypeHeader"],
    tenant: configData["tenant"],
    clientId: configData["clientId"],
    tokenStoreUrl: configData["tokenStoreUrl"],
    cacheLocation: configData["cacheLocation"],
    GraphApi: configData["GraphApi"]
};
// Check For & Handle Redirect From AAD After Login
authContext = new window.AuthenticationContext(config);
var isCallback = authContext.isCallback(window.location.hash);

if (isCallback) {
    authContext.handleWindowCallback();
}

var loginError = authContext.getLoginError();
if (loginError) {
    console.log('ERROR:\n\n' + loginError);
}
authContext.popUp = true;
if (isCallback && !loginError) {
    window.location = authContext._getItem(authContext.CONSTANTS.STORAGE.LOGIN_REQUEST);
}
var user = authContext.getCachedUser();
if (!user) {                            
    authContext.clearCache(); 
    sessionStorage["adal.login.request"] = "";                           
    authContext.login();
}

window.parent.authContext = authContext;

自从我上次看到这个问题已经有一段时间了,但是我当时设法解决了它。我实施了一种锁定机制,以确保在尝试获取令牌之前完成登录。

这是更新后的代码:

config = {
                            ApiUrl: configData["ApiUrl"],
                            SubscriptionKey: configData["SubscriptionKey"],
                            trace: configData["trace"],
                            AcceptHeader: configData["AcceptHeader"],
                            ContentTypeHeader: configData["ContentTypeHeader"],
                            tenant: configData["tenant"],
                            clientId: configData["clientId"],
                            tokenStoreUrl: configData["tokenStoreUrl"],
                            cacheLocation: configData["cacheLocation"],
                            GraphApi: configData["GraphApi"],
                            loadFrameTimeout: 10000
                        };


                    // Check For & Handle Redirect From AAD After Login
                    authContext = new window.AuthenticationContext(config);
                    var isCallback = authContext.isCallback(window.location.hash);

                    if (isCallback) {
                        authContext.handleWindowCallback();
                    }

                    var loginError = authContext.getLoginError();
                    if (loginError) {
                        // TODO: Handle errors signing in and getting tokens
                        console.log('ERROR:\n\n' + loginError);
                    }
                    authContext.popUp = true;
                    if (isCallback && !loginError) {
                        window.location = authContext._getItem(authContext.CONSTANTS.STORAGE.LOGIN_REQUEST);
                    }
                    var user = authContext.getCachedUser();
                    if (!user) {
                        authContext.clearCache();
                        sessionStorage["adal.login.request"] = "";
                        authContext.callback = function (error, token, msg) {
                            // remove lock
                            window.top.loginLock = null;
                            if (!!token) {
                                getGraphApiTokenAndUpdateUser(authContext);
                            }
                            else {
                                console.log('ERROR:\n\n' + error);
                            }
                        };

                        if (typeof (window.top.loginLock) == "undefined" || window.top.loginLock  == null) {
                            // Create lock
                            window.top.loginLock  = true;
                            authContext.login();
                        }
                    }

                    window.parent.authContext = authContext;