Обеспечение безопасности трафика от команд Microsoft к боту?

Как защитить трафик от Microsoft Teams к боту, чтобы бот мог отвечать на конкретные вопросы / дискуссии компании и не нуждался в анонимном WebAPI?

Интеграция ботов в пользовательский интерфейс команд проста со стороны фреймворка, но сейчас нет документации, как изолировать бота только для конкретного предприятия.

Экономическое обоснование. Мы хотим создать бот для конкретного предприятия, который мог бы отвечать на вопросы, относящиеся только к конкретному предприятию, откуда поступают вопросы. Технически это может быть сделано с помощью доступа только приложений к SharePoint или Microsoft Graph, но мы не можем анонимно предоставлять этот вид WebAPI для Интернета.

Какие-либо шаблоны дизайна для этого?

4 ответа

Теперь это возможно, и я даже реализовал это для Hubot в CoffeeScript и Node.JS. Ниже я описал то, как это будет выглядеть в JavaScript/Node.JS.

Определите переменную среды, которая, когда она установлена, фильтрует для определенного идентификатора клиента, OFFICE_365_TENANT_FILTER, (Делать это таким способом - удобный способ включить эту функцию в производстве, но не обязательно во время разработки.)

Для команд Microsoft идентификатор клиента Office 365 можно найти здесь: session.message.sourceEvent.tenant.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();
    }
  }
});
// [...]

Вот как это сделать в 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,...*"/>

Поиск идентификатора клиента Office 365 показывает, как это можно сделать с помощью PowerShell.

Хотя это не совсем то, что вы ищете, вы можете создавать пользовательских ботов, которые будут видны отдельным командам.

Ключ безопасности / аутентификация HMAC предотвратит доступ других пользователей к API. С тем недостатком, что вам придется настраивать бота с отдельным токеном безопасности для каждой команды, в которой вы хотите его использовать.

В настоящее время невозможно узнать идентификатор арендатора пользователя, общающегося с ботом сразу, если бот сначала не аутентифицирует пользователя. Пожалуйста, посмотрите на AuthBot. Это иллюстрирует, как отправить ссылку входа в систему пользователю и аутентифицировать пользователя по AAD.

Другие вопросы по тегам