我正在开发 Outlook 的 Office 加载项。目前,当我在 OWA 和 Outlook 桌面本地运行它时,它可以工作。
当我部署它并在不进行调试的情况下运行它时,在 Outlook 桌面中,当我尝试启动加载项时,我收到此消息:
我认为发生这种情况是因为 SSO 失败并且它试图回退到 MSAL 身份验证,而这在 Outlook 桌面中无法正常工作(下面对此有更多介绍)。
我这样做的原因是,当我在 OWA 中运行它时,我收到 MSAL 弹出窗口,并且可以看到记录了以下错误:
Office auth failed, falling back to MSAL.
Error: OSF.DDA.Error
{
name: 'Error occurred in the authentication request from Office.',
message: 'An unexpected error occurred in the client.',
code: 13006
}
第一行是我自己从
Office.auth.getAccessToken()
周围的 catch 块记录的内容。但是,在此之后,加载项确实可以在 OWA 中完全按照预期工作,包括经过身份验证的 API 调用(我可以将令牌视为这些请求的标头)。但正如前面提到的,如果我尝试在 Outlook 桌面中运行它,我会看到此对话框,并且它不会回退到 MSAL。
顺便说一句,我认为这种情况不应该发生,因为我已将其配置为允许登录提示和同意提示:
token = await Office.auth.getAccessToken({ allowSignInPrompt: true, allowConsentPrompt: true, forMSGraphAccess: false });
因此,即使 SSO 失败,用户仍然应该能够登录。但一次只会出现一个问题。
当我最初测试这个时,我看到了类似的行为,即我看到 OWA 中记录了此错误,并且我会在桌面中看到此对话框。不过,我在 OWA 中解决了这个问题,方法是确保清单中的所有域都匹配(就源而言,在
AppDomains
部分中列出,以及在 Azure 中的应用程序注册中的应用程序 ID URI 中列出)。当我在 OWA 中没有看到此错误时,我在 Outlook 桌面中也没有看到该对话框。
我认为这可能是相关的,因为显然在本地测试时域是
localhost
,而部署时不是这样,所以这两者之间是不同的。然而,据我所知,清单中的每个 URL 都是正确的。唯一的区别在于联系后端 - 在本地运行时,它看起来有点像这样:
组件 | 本地 | 已部署 |
---|---|---|
插件 | 本地主机:3000 | plugin.mydomain.com |
后端 | 本地主机:4000 | app.mydomain.com |
我在清单中将
mydomain.com
、app.mydomain.com
和 plugin.mydomain.com
列为应用程序域。我还验证了 Azure 中的应用程序注册、应用程序 ID 和范围是正确的,因为 a) 它在 OWA 中工作,b) 它在后端应用程序中工作(有自己的 SPA UI)。
我还需要检查什么?如何获取有关导致 13006 错误的原因的更多信息?
编辑:仍在研究此问题,但我认为问题是后端和加载项需要从同一域/子域运行。如果属实,这将是一个用于部署的 PITA,但可能是我的问题的原因。会确认。
正如怀疑的那样,这个问题是由不同的子域引起的。在清单中,您指定
Resource
,它是 Azure 中应用程序注册中的应用程序 ID URI。此 URI 的域和子域必须与加载加载项的 URI 的域和子域匹配。
在我的例子中,加载项是从
plugin.mydomain.com
加载的,但它与位于 app.mydomain.com
的后端进行通信。所以应用程序 ID URI 是 api://app.mydomain.com/[some guid]
。这有效地破坏了 SSO(尽管 MSAL 仍然有效)。
除了从同一子域托管我的后端和加载项之外,实际上没有任何办法解决这个问题。因此,作为一个简单的解决方法,我刚刚将后端注册中的应用程序 ID URI 更改为
api://plugin.mydomain.com/[some guid]
,现在 SSO 可以正常工作,并且我可以在 OWA 和 Outlook 桌面中使用该加载项。这是相当不优雅的,但这是我为了让它工作而必须做出的最小的妥协。