【问题标题】:Securing traffic from Microsoft Teams to a bot?保护从 Microsoft Teams 到机器人的流量?
【发布时间】:2018-04-20 03:59:02
【问题描述】:

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

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

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

有什么设计模式吗?

【问题讨论】:

    标签: microsoft-teams


    【解决方案1】:

    现在这是可能的,我什至已经在 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();
        }
      }
    });
    // [...]
    

    【讨论】:

    • 我在发现错误后稍微编辑了这个 - 我检查了错误的对象。
    【解决方案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,...*"/>
    

    Find your Office 365 tenant ID 展示了如何通过 PowerShell 进行操作。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 这实际上不是这里的问题,所以让我们从场景的角度进一步澄清这一点。我有一个在 Azure 中公开并使用机器人门户发布的 WebAPI。我怎么知道发送到该机器人的消息仅来自一个特定的企业/租户。如果我可以在 Teams 站点上为连接配置一个秘密,我可以在 http 流量中检查它,但这似乎是不可能的。为什么? - 这样我们就可以为机器人做企业场景 - 如果 WebAPI 匿名公开,不知道谁在调用机器人,我们就不能使用仅限应用程序的访问。
      • 您无法真正知道发送到机器人的消息是否仅来自特定租户。您只能在根据 AAD 对用户进行身份验证后才能弄清楚这一点。这就是我提到 AuthBot 的原因,它展示了如何对与 Bot Framework 机器人交谈的用户进行身份验证。
      【解决方案4】:

      虽然不完全是您要查找的内容,但您可以create custom bots 将范围限定为各个团队。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-05
        • 2019-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多