Bot Framework Composer 技能主机端点 401 未经授权

Tre*_*oks 8 c# botframework direct-line-botframework bot-framework-composer

我有一个用 C# 编写的机器人框架技能,它将消息从后端服务中继到使用 Bot Framework Composer 制作的消费者机器人。Skill Bot 在单独的控制器 api/message/BackendMessage 上接收来自后端服务的消息。

[Route("api/message")]
[ApiController]
public class SkillBotBackendController : ControllerBase
{
   ...
Run Code Online (Sandbox Code Playgroud)

当技能机器人收到消息时,它会将其发送到与消费者机器人的对话中,如下所示......

[HttpPost]
[Route("BackendMessage")]
public async Task PostAsync([FromBody] BackendMessage content)
{
   ...

     await _botFrameworkAdapter.ContinueConversationAsync(
         msAppId,
         conversationRec.ConversationReference,
         (ITurnContext turnContext, CancellationToken cancellationToken) =>
             turnContext.SendActivityAsync(MessageFactory.Text(backendMessage), 
                cancellationToken), default(CancellationToken));
Run Code Online (Sandbox Code Playgroud)

消费者机器人可以看到直接来自技能机器人的所有消息,但看不到技能机器人从后端服务接收的消息。这是一些 ngrok 条目,显示...

POST /api/skills/v3/conversations/ba72ce2d-3a86-4d86-b640-9a4f3c4d5996/activities/e13d97b4-c715-4572-8d 200 OK
POST /api/skills/v3/conversations/ba72ce2d-3a86-4d86-b640-9a4f3c4d5996/activities/e13d97b4-c715-4572-8d 200 OK
POST /api/skills/v3/conversations/ba72ce2d-3a86-4d86-b640-9a4f3c4d5996/activities/52e6e511-8f72-4b55-97 401 Unauthorized
POST /api/skills/v3/conversations/ba72ce2d-3a86-4d86-b640-9a4f3c4d5996/activities/52e6e511-8f72-4b55-97 401 Unauthorized
POST /api/skills/v3/conversations/ba72ce2d-3a86-4d86-b640-9a4f3c4d5996/activities/52e6e511-8f72-4b55-97 401 Unauthorized
POST /api/skills/v3/conversations/ba72ce2d-3a86-4d86-b640-9a4f3c4d5996/activities/52e6e511-8f72-4b55-97 401 Unauthorized
POST /api/skills/v3/conversations/ba72ce2d-3a86-4d86-b640-9a4f3c4d5996/activities/52e6e511-8f72-4b55-97 200 OK
POST /api/skills/v3/conversations/ba72ce2d-3a86-4d86-b640-9a4f3c4d5996/activities/52e6e511-8f72-4b55-97 200 OK
POST /api/skills/v3/conversations/ba72ce2d-3a86-4d86-b640-9a4f3c4d5996/activities/52e6e511-8f72-4b55-97 200 OK
POST /api/skills/v3/conversations/ba72ce2d-3a86-4d86-b640-9a4f3c4d5996/activities/52e6e511-8f72-4b55-97 200 OK
Run Code Online (Sandbox Code Playgroud)

被拒绝的消息具有HttpContext.Request.Headers["Authorization"]与其他消息不同的令牌,接受的令牌的受众具有作曲家机器人的应用程序 ID,被拒绝的令牌的受众是https://api.botframework.com

希望有一个简单的解释和解决方案。

Tre*_*oks 3

感谢微软的回答:

将其添加到对话框中:

private void AddOrUpdateContinuationParameters(ITurnContext turnContext)
{
    var continuationParameters = new ContinuationParameters
    {
        ClaimsIdentity = turnContext.TurnState.Get<IIdentity>(BotAdapter.BotIdentityKey),
        ConversationReference = turnContext.Activity.GetConversationReference(),
        OAuthScope = turnContext.TurnState.Get<string>(BotAdapter.OAuthScopeKey)
    };

        _continuationParametersStore.AddOrUpdate(continuationParameters.ConversationReference.Conversation.Id, continuationParameters, (_, __) => continuationParameters);
}
Run Code Online (Sandbox Code Playgroud)

更改对 ContinueConversationAsync 的调用以包含 continuationParameters:

await _botFrameworkAdapter.ContinueConversationAsync(
          (ClaimsIdentity)continuationParameters.ClaimsIdentity,
          conversationRec.ConversationReference, 
          continuationParameters.OAuthScope, 
          (ITurnContext turnContext, CancellationToken cancellationToken) => turnContext.SendActivityAsync(MessageFactory.Text(backendMessage), cancellationToken),
          default);
Run Code Online (Sandbox Code Playgroud)