Office Word Add-in基于ADAL.js的ADFS登录后无法返回插件及获取用户信息问题
问题拆解与解决办法
你遇到的核心问题是ADAL.js的默认重定向逻辑不兼容Office Add-in的iframe运行环境——Office Add-in是嵌在Office客户端的iframe里的,默认登录流程会跳出这个容器打开新窗口,导致登录后的凭证没法回传给Add-in,自然拿不到用户信息。下面是具体的修复步骤:
1. 先把ADAL的重定向地址配置对
首先检查你的config里的redirectUri,必须设置成你的Office Add-in自身的页面URL(比如https://your-addin-domain.com/index.html),而且这个地址必须和你在ADFS里注册应用时填的重定向URI完全一致(包括协议、域名、路径,一个字符都不能差)。
修改后的配置示例:
var config = { clientId: "你的应用注册ID", redirectUri: "https://your-addin-domain.com/index.html", // 重点:设为Add-in的启动页面 authority: "https://your-adfs-server.com/adfs", // 其他配置项 }; var authContext = new AuthenticationContext(config);
2. 启用适配Office的静默登录模式
Office Add-in不适合用弹出新窗口的登录方式,优先用iframe静默登录,避免跳出Add-in容器。你可以调整登录逻辑,先尝试静默获取token,失败了再触发登录:
// 先检查有没有缓存的登录状态 if (!authContext.getCachedUser()) { // 发起静默登录请求 authContext.acquireTokenRedirect(config.clientId, function(error, token) { if (error) { // 静默失败(比如用户没登录会话),再跳转到ADFS登录页 authContext.loginRedirect({ prompt: 'login', redirectUri: config.redirectUri }); } else { // 成功拿到token,获取用户信息 var userInfo = authContext.getCachedUser(); console.log("登录用户信息:", userInfo); // 这里写你的业务逻辑 } }); } else { // 已经有登录状态,直接取用户信息 var userInfo = authContext.getCachedUser(); console.log("当前登录用户:", userInfo); }
3. 必须处理重定向后的回调
当ADFS登录完成后,会跳回你设置的redirectUri,这时候得让ADAL处理这个回调,把授权码换成token并存进缓存。在你的Add-in启动页面(比如index.html)的脚本最开头加这段代码:
// 处理ADFS重定向回来的授权回调 authContext.handleWindowCallback();
这一步是关键,没它的话ADAL没法识别登录后的返回参数,自然拿不到用户信息。
4. 检查ADFS的应用注册配置
- 确认ADFS里你的应用的重定向URI和ADAL配置的
redirectUri完全匹配。 - 确保应用已经被授予了获取用户信息的权限(比如
openid、profile这类基础权限)。
5. 额外:避免意外弹出新窗口
如果还是会弹出新窗口,你可以在调用loginRedirect时加上popUp: false参数,强制用当前iframe重定向(注意要确保Office客户端允许iframe的跨域跳转)。
验证方法
- 点击登录按钮后,应该在Add-in的iframe内跳转ADFS登录页(或者弹出一个被Office控制的小窗口)。
- 登录完成后,自动回到你的Add-in页面,此时控制台打印的
userInfo应该有完整的用户数据。 - 要是还有问题,打开浏览器控制台看ADAL的错误日志,能帮你快速定位哪里配置错了。
内容的提问来源于stack exchange,提问作者taps bops
相关产品推荐
相关产品推荐

