You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 09:36:04