什么是 botframework 安全模型?

What is the botframework security model?

我正在探索 Microsoft Bot Builder SDK 以创建与 MS Teams 集成的聊天机器人。大多数提供的 samples 没有任何身份验证机制,并且引用 OAuth 的示例似乎这样做是为了允许机器人使用代表流程访问资源。考虑安全模型的正确方法是应该考虑机器人 public 并且访问的任何非 public 信息都是从调用用户的上下文中完成的?

Bot Framework 有三种 authentication/authorization 需要考虑:

  1. Bot auth - Microsoft 应用 ID 和密码
  2. Client auth - 直线secret/token,或其他渠道的各种机制
  3. User auth - OAuth cards/prompts/tokens

不幸的是,关于哪个是哪个的文档有些不一致,但我刚刚在这里提出了一个问题:https://github.com/MicrosoftDocs/bot-docs/issues/1745

无论如何,没有必要将所有机器人都视为“public”。 Bot Builder SDK 使用其应用程序 ID 和密码对传入消息和传出消息进行身份验证。这意味着发送到 bot 端点的任何未经授权的消息都将被拒绝,并且没有其他 bot 可以冒充您的。

一般来说,如果您希望机器人代表用户访问安全信息,您应该让用户登录。但既然你提到想要限制对特定租户的机器人访问,我可以简要解释一下如何做到这一点。您可以找到在 C# 中执行此操作的中间件 here,这是我认为通过使用哈希集而不是字典改进的代码的修改版本:

public class TeamsTenantFilteringMiddleware:IMiddleware
{
    private readonly HashSet tenantMap;
 
    public TeamsTenantFilteringMiddleware(IEnumerable allowedTenantIds)
    {
        如果(allowedTenantIds == null)
        {
            抛出新的 ArgumentNullException(nameof(allowedTenantIds));
        }
 
        this.tenantMap = new HashSet(allowedTenantIds);
    }
 
    public 异步任务 OnTurnAsync(ITurnContext turnContext, NextDelegate next, CancellationToken cancellationToken = default(CancellationToken))
    {
        如果 (!turnContext.Activity.ChannelId.Equals(Channels.Msteams, StringComparison.OrdinalIgnoreCase))
        {
            等待下一个(取消令牌).ConfigureAwait(假);
            return;
        }
 
        TeamsChannelData teamsChannelData = turnContext.Activity.GetChannelData();
        string tenantId = teamsChannelData?.Tenant?.Id;
 
        如果(string.IsNullOrEmpty(tenantId))
        {
            throw new UnauthorizedAccessException("Tenant Id is missing.");
        }
 
        如果 (!this.tenantMap.Contains(tenantId))
        {
            throw new UnauthorizedAccessException("Tenant Id '" + tenantId + "' 不允许访问。");
        }
 
        等待下一个(取消令牌).ConfigureAwait(假);
    }
}