保护从Microsoft Teams到bot的流量?

时间:2016-11-03 09:58:59

标签: microsoft-teams

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

从机器人框架方面可以轻松地集成到团队用户界面,但是目前还没有关于如何仅为特定企业隔离机器人的文档。

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

这有什么设计模式吗?

4 个答案:

答案 0 :(得分:4)

现在可以了,我实际上甚至在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();
    }
  }
});
// [...]

答案 1 :(得分: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)

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

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

Find your Office 365 tenant ID展示了如何通过PowerShell实现这一目标。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

虽然不完全符合您的要求,但您可以create custom bots将其范围限定为各个团队。

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