什么是僵尸框架安全模型?



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

机器人框架需要考虑三种类型的身份验证/授权:

  1. 机器人身份验证 - Microsoft应用 ID 和密码
  2. 客户端身份验证 - 直接线路机密/令牌,或其他通道的各种机制
  3. 用户身份验证 - OAuth 卡/提示/令牌

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

无论如何,没有必要将所有机器人都视为"公共"。 机器人生成器 SDK 使用其应用 ID 和密码对传入消息和传出消息进行身份验证。这意味着发送到机器人终结点的任何未经授权的消息都将被拒绝,并且没有其他机器人可以模拟你的消息。

通常,如果希望机器人代表用户访问安全信息,则应让用户登录。但是,由于您提到希望将机器人访问限制为特定租户,我可以简要解释如何做到这一点。你可以在这里找到用 C# 完成的中间件,下面是代码的修改版本,我认为通过使用哈希集而不是字典来改进它:

公共类 Teams租户筛选中间件 : IMiddleware { 私有只读 HashSettenantMap;  public TeamsTenantFilteringMiddleware(IEnumerableallowedTenantIds( { if (allowTenantIds == null( { 抛出新的 ArgumentNullException(nameof(allowedTenantIds((; }  this.tenantMap = new HashSet(allowedTenantIds(; }  public async Task OnTurnAsync(ITurnContext turnContext, NextDelegate next, CancelToken cancelToken = default(CancelToken(( { if (!turnContext.Activity.ChannelId.Equals(Channels.Msteams, StringComparison.OrdinalIgnoreCase(( { 等待下一个(取消令牌(。ConfigureAwait(false(; 返回; }  TeamsChannelData teamsChannelData = turnContext.Activity.GetChannelData((; 字符串租户 ID = 团队频道数据?。房客?。韦德  如果(字符串。IsNullOrEmpty(tenantId(( { 抛出新的 UnauthorizedAccessException("租户 ID 丢失"(; }  if (!this.tenantMap.Contains(tenantId(( { 抛出新的 UnauthorizedAccessException("租户 ID '" + 租户 ID + "' 不允许访问。 }  等待下一个(取消令牌(。ConfigureAwait(false(; } }

最新更新