什么是 botframework 安全模型?
What is the botframework security model?
我正在探索 Microsoft Bot Builder SDK 以创建与 MS Teams 集成的聊天机器人。大多数提供的 samples 没有任何身份验证机制,并且引用 OAuth 的示例似乎这样做是为了允许机器人使用代表流程访问资源。考虑安全模型的正确方法是应该考虑机器人 public 并且访问的任何非 public 信息都是从调用用户的上下文中完成的?
Bot Framework 有三种 authentication/authorization 需要考虑:
- Bot auth - Microsoft 应用 ID 和密码
- Client auth - 直线secret/token,或其他渠道的各种机制
- 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(假);
}
}
我正在探索 Microsoft Bot Builder SDK 以创建与 MS Teams 集成的聊天机器人。大多数提供的 samples 没有任何身份验证机制,并且引用 OAuth 的示例似乎这样做是为了允许机器人使用代表流程访问资源。考虑安全模型的正确方法是应该考虑机器人 public 并且访问的任何非 public 信息都是从调用用户的上下文中完成的?
Bot Framework 有三种 authentication/authorization 需要考虑:
- Bot auth - Microsoft 应用 ID 和密码
- Client auth - 直线secret/token,或其他渠道的各种机制
- 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 HashSettenantMap; 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(假); } }