0

如何保护从 Microsoft Teams 到机器人的流量,以便机器人可以回答公司特定的问题/讨论,并且不需要公开为匿名 WebAPI?

从 bot 框架方面,Bot 与 Teams UI 的集成很容易,但目前没有关于如何仅为特定企业隔离 bot 的文档。

商业案例——我们想要构建企业特定的机器人,它只能回答特定于问题所在的特定企业的问题。从技术上讲,这可以通过仅应用程序访问 SharePoint 或 Microsoft Graph 来完成,但我们不能将这种 WebAPI 匿名公开给 Internet。

有什么设计模式吗?

4

4 回答 4

6

现在这是可能的,我什至已经在 CoffeeScript 和 Node.JS 中为 Hubot 实现了它。我在下面描述的是它在 JavaScript/Node.JS 中的样子。

定义一个环境变量,设置该变量后,将过滤特定租户 ID OFFICE_365_TENANT_FILTER,. (这样做是在生产中启用此功能的一种方便方法,但在开发期间不一定。)

对于 Microsoft Teams,可以在此处找到 Office 365 租户 ID session.message.sourceEvent.tenant.id:.

最优雅的方法是检查租户 ID 作为中间件,如果设置了过滤器并且它不匹配,则只需放弃对消息的进一步处理:

// [...]
var connector = new builder.ChatConnector({
  appId: process.env.MICROSOFT_APP_ID,
  appPassword: process.env.MICROSOFT_APP_PASSWORD
});

var bot = new builder.UniversalBot(connector);

// Middleware to check for OFFICE_365_TENANT_FILTER and only continue processing if it matches. 
// If OFFICE_365_TENANT_FILTER is not specified, do nothing.
bot.use({
  botbuilder: function(session, next) {
    var targetTenant = typeof(process.env.OFFICE_365_TENANT_FILTER) !== "undefined" ? process.env.OFFICE_365_TENANT_FILTER : null;
    var currentMsgTenant = typeof(session.message.sourceEvent.tenant) !== "undefined" ? session.message.sourceEvent.tenant.id : null;
    if (targetTenant !== null) { 
      if (targetTenant == currentMsgTenant) {
        next();
      }
      else {
        console.log("MS Teams: Attempted access from a different Office 365 tenant (" + currentMsgTenant + "): message rejected");
      }
    }
    else {
      next();
    }
  }
});
// [...]
于 2017-05-18T02:49:45.833 回答
2

这是在 C# 中执行此操作的方法,SDK 公开了TenantFilter允许您将此操作过滤器添加到控制器类的方法,如下所示。

using Microsoft.Bot.Connector.Teams;

namespace Microsoft.Teams.Samples.HelloWorld.Web.Controllers
{
    [BotAuthentication, TenantFilter]
    public class MessagesController : ApiController
    {
        [HttpPost]
        public async Task<HttpResponseMessage> Post([FromBody] Activity activity)

租户过滤器将采用逗号分隔的租户 ID 列表,这些租户 ID 需要放置在 web.config 中

<configuration>
  <appSettings>
    <!--other settings-->
    <add key="AllowedTenants" value="*TenantId1,TenantId2,...*"/>

查找您的 Office 365 租户 ID展示了如何通过 PowerShell 进行此操作。

于 2018-04-19T19:59:02.390 回答
0

尽管不完全符合您的要求,但您可以创建自定义机器人,这些机器人将限定在各个团队中。

安全密钥/HMAC 身份验证将阻止其他人访问 API。缺点是您必须为要使用它的每个团队使用单独的安全令牌配置机器人。

于 2017-04-10T09:29:41.790 回答
0

目前无法立即知道与机器人聊天的用户的租户 ID,除非机器人首先对用户进行身份验证。请看一下AuthBot。它说明了如何向用户发送登录链接并针对 AAD 对用户进行身份验证。

于 2016-11-03T19:17:24.660 回答