Outlook加载项OBO流多租户场景MFA验证实现咨询
Outlook 加载项跨租户SSO访客用户MFA问题解决方案
疑问答复
1. 方案1通过window.open拉起MFA是否合规可用
该方案既不合规也不可用,不建议使用
- 兼容性问题:Outlook加载项运行在各端嵌入式WebView沙箱中,桌面端、移动端默认会拦截
window.open触发的非系统级弹窗,部分环境即使弹窗拉起成功,弹窗内的身份会话和加载项运行上下文不互通,完成MFA后回到加载项重新取令牌,依然不会带上所需的MFA声明,OBO请求还是会报50076错误。 - 合规问题:Office应用商店上架审核明确要求所有身份认证、授权流程必须通过Office JS官方提供的认证接口完成,自定义弹窗拉起认证流程的实现会直接被驳回。
- 逻辑缺陷:手动拼接的是主租户的授权地址,完成MFA后仅在主租户域下生成有效会话,而
Office.auth.getAccessToken默认获取的是用户当前登录的客户租户签发的令牌,两个租户的会话、MFA声明默认不互通,手动完成主租户MFA不会给客户租户签发的令牌附加主租户认可的MFA声明。
2. 方案2的正确实现方式
方案2是官方推荐的合规实现路径,不需要额外配置强制Office JS触发主租户MFA,按如下逻辑处理即可
50076错误本质是AAD返回的MFA声明挑战,处理核心是透传挑战参数,由Office JS原生处理交互:
- 服务端发起OBO请求捕获到50076错误时,不要只返回错误码,必须把错误响应体中自带的
claims字段完整透传回加载项前端,不要对这个字段做任何转义、修改。 - 加载项拿到透传的
claims参数后,再次调用Office.auth.getAccessToken时,将该参数传入authChallenge配置项,Office JS会自动识别挑战要求,原生拉起对应租户的MFA验证流程,自动处理跨租户的声明信任传递,不需要手动拼接授权地址、自定义弹窗。 - 用户完成MFA后,
getAccessToken会直接返回携带有效MFA声明的客户租户令牌,将该令牌传回服务端重新发起OBO请求,即可正常兑换到主租户访问令牌。
核心代码参考
服务端OBO错误处理
// 发起OBO请求后捕获错误 if (error.response && error.response.data.error_codes.includes(50076)) { // 直接透传原生claims字段,不做任何修改 return res.status(403).json({ code: "MFA_REQUIRED", claims: error.response.data.claims }) }
加载项前端处理
// 首次获取令牌调用后端接口 let accessToken = await Office.auth.getAccessToken({ allowSignInPrompt: true }); let bizResponse = await callBackendApi(accessToken); // 触发MFA挑战时重新取令牌 if (bizResponse.code === "MFA_REQUIRED") { accessToken = await Office.auth.getAccessToken({ allowSignInPrompt: true, // 传入透传回来的claims触发原生MFA流程 authChallenge: bizResponse.claims }); // 用新令牌重新请求业务接口 bizResponse = await callBackendApi(accessToken); }
额外配置提示:需要在主租户Azure AD的跨租户访问设置中,开启对访客用户所属客户租户的MFA声明信任,否则会出现客户租户侧已完成MFA,但主租户不认可对应声明的问题。
内容的提问来源于stack exchange,提问作者HILARUDEEN S ALLAUDEEN
相关产品推荐
相关产品推荐

