如何使用 Microsoft Bot Framework SDK v4 从专用租户中的聊天机器人向 MS Teams 进行身份验证?

How to authenticate to MS Teams from a chatbot in a dedicated tenant with Microsoft Bot Framework SDK v4?

我在从公司环境(有专用租户)向 MS Teams 发送请求时遇到身份验证问题。我不知道这是一个错误还是我滥用了 SDK。我已经看到 Microsoft 提供的 Teams samples 但所有这些 运行 在 public Azure 上没有专用租户,我怀疑我的问题在某种程度上与使用专用租户有关(有一个专用租户,要么是 SDK 中的错误,要么是我的代码或机器人清单中的某处配置错误)。

我正在处理的应用程序非常特定于业务,因此我在这个 github 存储库中创建了一个项目,用最少的代码重现问题:msteams-bot-auth-issue使用此示例项目需要在专用租户上安装 Teams 机器人(我显然不能发布我的公司租户详细信息)。

基本上,我们的应用程序分为两部分:一部分从 MS Teams 频道接收机器人活动。另一个处理它们(第一部分将活动转发给第二部分)。

我们正确地接收了来自 MS Teams 的活动。 但我们无法调用 MS Teams API 让 Teams 成员参与对话(HTTP 401 响应消息 { "message": "Authorization has been denied for this request." })。

有趣的是,如果我使用 Microsoft.Bot.Connector v4.7.3(我们在应用程序中实际使用的版本),行为与 Microsoft.Bot.Connector v4 有点不同.15.0:在v4.7.3中,请求获取会话成员前不请求access token;在 v4.15.0 中,访问令牌成功获取,并向会话成员请求请求,但我们仍然得到 HTTP 401 响应。因为我们得到的是 HTTP 401 而不是 HTTP 403,我想 MS Teams 无法识别访问令牌。

无论请求中是否包含访问令牌,MS Teams 响应始终相同(HTTP 401 和错误消息)。

访问令牌请求由两个请求组成:

响应包含访问令牌,日志显示“GetTokenAsync:在 876 中使用 ADAL 获取令牌”(Bot Framework SDK 发出的日志)。

然后使用访问令牌发送实际会话成员请求(使用 HTTP header Authorization: Bearer ...),响应始终为 HTTP 401。

当我解码 https://jwt.io 中的 JWT 时,我看到这些字段(以及其他字段):

有趣的是,如果将 MicrosoftAppCredentials class 中的范围参数设置为 AuthenticationConstants.ToChannelFromBotOAuthScope,则 JWT 中没有任何变化。所以可能没有为我们的应用程序正确设置访问权限。

也许这是我们的应用程序清单的问题,但我认为我们遵循了 MS Teams 机器人的示例。我们清单中的 permissions 字段设置为 [ "identity", "messageTeamMembers" ]

有很多关于 Bot Framework 和 MS Teams 的资源,但我没有找到任何对这种情况有意义的文档。

这可能是企业代理造成的,但我不这么认为(我不能保证)。

我准确地说这是一个应用程序到应用程序的身份验证,有时也被描述为“常规机器人场景”(此处不涉及用户身份验证)。

感谢@StevenKanberg 的评论,该问题已解决并且与公司代理和租户限制功能有关。

以下是我的观察:

即使我们使用企业 MS Teams 租户,我们也不得向该租户进行身份验证。我真的不明白为什么,但我们必须直接向 MS Teams 进行身份验证。因此,在实例化 MicrosoftAppCredentials, argument ChannelAuthTenant must not be set (meaning default tenant "botframework.com" will be used). Curiously, authentication worked with our tenant id, but access token was not usable/recognized by MS Teams (error 401 returned by MS Teams). With default tenant, and without proper tenant restrictions feature 配置时,我们无法首先进行身份验证(MS Teams 还返回了关于租户的更明确的错误)。