В Bot Framework необходимо учитывать три типа аутентификации / авторизации:
- Бот-аутентификация - идентификатор и пароль приложения Microsoft
- Клиентская аутентификация - секрет / токен прямой линии или различные механизмы для других каналов
- авторизация пользователя - карты / подсказки / токены OAuth
К сожалению, есть некоторая несогласованность в документации о том, что есть что, но я только что поднял здесь проблему: https://github.com/MicrosoftDocs/bot-docs/issues/1745
В любом случае нет необходимости думать обо всех ботах как о «publi c. " Пакет SDK для создания ботов аутентифицирует как входящие, так и исходящие сообщения, используя свой идентификатор приложения и пароль. Это означает, что любые неавторизованные сообщения, отправленные на конечную точку бота, будут отклонены, и никакой другой бот не сможет выдать себя за ваше.
В общем, вы должны сделать так, чтобы пользователь вошел в систему, если вы хотите, чтобы бот получал доступ к защищенной информации от имени пользователя. . Но поскольку вы упомянули, что хотите ограничить доступ ботов к определенным c клиентам, я могу кратко объяснить, как это сделать. Вы можете найти промежуточное ПО здесь , которое делает это в C#, а вот модифицированная версия кода, которая, как мне кажется, улучшает его за счет использования набора ha sh вместо словаря:
public class TeamsTenantFilteringMiddleware : IMiddleware
{
private readonly HashSet tenantMap;
public TeamsTenantFilteringMiddleware(IEnumerable allowedTenantIds)
{
if (allowedTenantIds == null)
{
throw new ArgumentNullException(nameof(allowedTenantIds));
}
this.tenantMap = new HashSet(allowedTenantIds);
}
public async Task OnTurnAsync(ITurnContext turnContext, NextDelegate next, CancellationToken cancellationToken = default(CancellationToken))
{
if (!turnContext.Activity.ChannelId.Equals(Channels.Msteams, StringComparison.OrdinalIgnoreCase))
{
await next(cancellationToken).ConfigureAwait(false);
return;
}
TeamsChannelData teamsChannelData = turnContext.Activity.GetChannelData();
string tenantId = teamsChannelData?.Tenant?.Id;
if (string.IsNullOrEmpty(tenantId))
{
throw new UnauthorizedAccessException("Tenant Id is missing.");
}
if (!this.tenantMap.Contains(tenantId))
{
throw new UnauthorizedAccessException("Tenant Id '" + tenantId + "' is not allowed access.");
}
await next(cancellationToken).ConfigureAwait(false);
}
}