在Dynamics 365中使用ADAL.js实现无弹窗获取Token的方案咨询
优化ADAL.js获取CRM认证Token的方案(无弹窗优先)
首先纠正一个关键误区
你提到的microsoftTeams.getContext()是Microsoft Teams专属的客户端API,在Dynamics CRM环境里自然不会有返回值——这个API只能在Teams内嵌的应用中使用,和CRM的认证流程完全不相关,所以用它做静默认证的登录提示是走不通的。
无弹窗静默认证的正确实现(ADAL.js原生支持)
ADAL.js本身就提供了acquireTokenSilent方法,这才是实现无弹窗静默认证的正确方式。它会自动尝试从缓存获取有效token,或者通过隐藏的iframe向AD FS/AAD发起静默请求(不需要用户交互)。
核心逻辑要点:
- 优先调用
acquireTokenSilent,如果成功直接返回token - 如果静默请求失败(比如token过期且需要用户重新授权、用户会话失效等),再fallback到弹窗登录(或者根据需求引导用户跳转)
优化你的现有弹窗方案
你当前手动监听popup的location、设置定时器的逻辑其实没必要——ADAL.js已经封装了loginPopup和acquireTokenPopup方法,会自动处理弹窗的打开、回调接收和关闭,代码会简洁很多,也避免了手动操作DOM的潜在问题。
完整优化后的代码示例
var getUser = function () { return new Promise(function (resolve, reject) { // 1. 先尝试从缓存获取用户和token var user = authContext.getCachedUser(); var cachedToken = authContext.getCachedToken(clientId); if (user && cachedToken) { resolve(cachedToken); return; } // 2. 尝试静默获取token(无弹窗) authContext.acquireTokenSilent(clientId, null) .then(function (token) { resolve(token); }) .catch(function (silentError) { // 静默失败,fallback到弹窗登录 console.log("Silent auth failed, falling back to popup:", silentError); // 使用ADAL.js内置的popup方法,自动处理回调和关闭 authContext.acquireTokenPopup(clientId) .then(function (token) { resolve(token); }) .catch(function (popupError) { reject(popupError || "Popup authentication failed"); }); }); }); };
额外的CRM环境适配建议
在Dynamics CRM中使用ADAL.js时,需要确保:
- CRM的域名已经添加到AAD应用的重定向URI列表中(包括弹窗回调的URI)
- 如果是使用CRM Online,确认AAD应用的权限配置正确(需要
Dynamics CRM Online的委派权限) - 静默认证需要用户已经有有效的AAD会话(比如之前登录过Office 365),否则还是会需要交互
内容的提问来源于stack exchange,提问作者Richa Tibrewal
相关产品推荐
相关产品推荐

