You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 04:06:08