基于Microsoft 365 Agents Toolkit创建Teams/Copilot应用的技术问询
针对Teams和Microsoft 365 Copilot复用Entra External ID认证的问题解答
1. 应用类型选择:自定义引擎还是其他?
- 若你需要深度集成Copilot语义能力、自定义后端数据交互逻辑,**自定义引擎(Custom Plugin/Engine)**是最优选择,它能直接复用现有Web应用的Entra认证流程,完美适配后端权限规则。
- 若仅需基础消息交互+权限校验,也可考虑Teams消息扩展或Copilot插件,但自定义引擎的灵活性更高,更贴合你复用现有认证体系的需求。
- 参考Asana的实现逻辑:它本质是Copilot插件+OAuth授权复用,要对齐这个模式,自定义引擎插件是最匹配的选项。
2. 授权问题排查与解决(Azure Bot OAuth无效的情况)
- 确认Entra应用注册配置:
- 确保Entra External ID应用注册中已添加
Teams和Microsoft 365 Copilot的平台配置,重定向URI需包含https://token.botframework.com/.auth/web/redirect(Azure Bot的OAuth回调地址)。 - 检查API权限:需添加
User.Read委托权限,并确保已授予管理员同意(针对租户内用户场景)。
- 确保Entra External ID应用注册中已添加
- Azure Bot OAuth设置修正:
- 在Azure Bot的「身份验证」面板关联Entra应用时,选择「任何组织目录和个人Microsoft账户」(外部用户场景),而非仅租户内账号。
- 验证连接名称一致性:Bot代码调用OAuth时,必须使用与Azure Bot配置一致的连接名,示例代码:
await turnContext.Adapter.GetUserTokenAsync(turnContext, "YourEntraConnectionName", null, cancellationToken);
- 权限传递逻辑检查:
- 确保从Bot获取的token能直接传递给Web应用后端,后端需验证token的签名、受众(aud)和过期时间,避免因token格式不匹配导致授权失败。
3. Copilot发消息时重定向至Teams登录
- 在自定义引擎代码中,检测到用户未携带有效认证token时,返回
ActionTypes.Redirect类型响应,指定重定向URL为Teams OAuth授权入口:return new ActionResponse { Type = ActionTypes.Redirect, Value = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=YOUR_ENTRA_CLIENT_ID&response_type=code&redirect_uri=https://your-bot-domain/.auth/web/redirect&scope=User.Read" }; - 确保重定向URI已在Entra应用注册中配置,Teams客户端能正确处理跳转,完成授权后将token返回给Bot,再传递给自定义引擎。
- 若使用Copilot插件框架,可在
plugin.json中配置authorization字段,指定OAuth2授权端点,Copilot会自动触发登录流程。
4. 创建类似Asana的弹窗获取用户详情
- 使用Teams**任务模块(Task Module)**实现弹窗:
- 在Bot代码中构造任务模块请求,指定弹窗URL(复用现有Web应用的用户详情页面,已集成Entra认证):
var taskModuleResponse = new TaskModuleResponse { Task = new TaskModuleContinueResponse { Value = new TaskModuleTaskInfo { Title = "用户详情", Url = "https://your-web-app.com/user-profile", Height = 500, Width = 600 } } }; await turnContext.SendActivityAsync(MessageFactory.Attachment(taskModuleResponse.ToAttachment()), cancellationToken);- 确保Web应用页面适配Teams任务模块尺寸,且已集成Entra认证,避免用户重复登录。
- 若基于Copilot插件,可在插件交互逻辑中调用Teams任务模块API触发弹窗,获取用户输入后将数据传递回Copilot引擎。
内容的提问来源于stack exchange,提问作者Selva
相关产品推荐
相关产品推荐

