Bot Framework Composer Skill Host Endpoint 401 Unauthorized问题咨询
问题原因
- Bot Framework Adapter默认生成令牌的逻辑会根据目标场景自动设置受众(aud):正常Skill对话流转中回复Consumer Bot时,Adapter会自动识别对方为Skill Consumer,因此将令牌受众设置为Consumer Bot的App ID,校验可正常通过。
- 你在
BackendMessage控制器中调用ContinueConversationAsync时,未显式指定Skill Consumer的相关配置,Adapter默认将请求判定为发送给Bot Framework官方通道服务的请求,因此令牌受众被设置为https://api.botframework.com,而Consumer Bot的Skill校验逻辑要求令牌受众必须为自身的App ID,所以直接返回401未授权。
解决方案
以下两种方案均可修复该问题,可按需选择:
方案1:调用带受众参数的ContinueConversationAsync重载
显式指定令牌受众为Consumer Bot的App ID,适配Skill到Consumer的通信场景:
[HttpPost] [Route("BackendMessage")] public async Task PostAsync([FromBody] BackendMessage content) { // 提前定义好常量:Consumer的App ID、Skill自身的App ID const string ConsumerBotAppId = "你的Composer Consumer Bot App ID"; const string SkillBotAppId = "你的Skill Bot App ID"; await _botFrameworkAdapter.ContinueConversationAsync( SkillBotAppId, conversationRec.ConversationReference, ConsumerBotAppId, // 新增参数:指定令牌受众为Consumer Bot App ID (ITurnContext turnContext, CancellationToken cancellationToken) => turnContext.SendActivityAsync(MessageFactory.Text(backendMessage), cancellationToken), default(CancellationToken)); }
方案2:使用专门的SkillHttpClient发送消息
SkillHttpClient是SDK内置的专门用于Skill与Consumer通信的客户端,会自动处理令牌受众配置:
// 首先在Startup/Program中注入SkillHttpClient services.AddSingleton<SkillHttpClient>(); // 控制器中调用代码 [HttpPost] [Route("BackendMessage")] public async Task PostAsync([FromBody] BackendMessage content, [FromServices] SkillHttpClient skillClient) { const string ConsumerBotAppId = "你的Composer Consumer Bot App ID"; const string SkillBotAppId = "你的Skill Bot App ID"; var skillInfo = new BotFrameworkSkill { AppId = SkillBotAppId, SkillEndpoint = new Uri("Consumer Bot的Skill接入端点,一般格式为https://<Consumer Bot域名>/api/skills") }; await skillClient.PostActivityAsync( SkillBotAppId, skillInfo, new Uri(conversationRec.ConversationReference.ServiceUrl), conversationRec.ConversationReference.Conversation.Id, MessageFactory.Text(backendMessage), default); }
注意事项
- 你存储的
ConversationReference必须是从Consumer Bot发起的Skill调用上下文中获取的,不可自行构造,否则也会出现校验失败问题。 - 提前确认Skill Bot的App ID已被添加到Consumer Bot的允许Skill访问列表中,无额外权限限制。
内容的提问来源于stack exchange,提问作者TrevorBrooks
相关产品推荐
相关产品推荐

