【问题标题】:Value cannot be null. (Parameter 'clientSecret') when sending an activity from a bot值不能为空。 (参数'clientSecret')从机器人发送活动时
【发布时间】:2020-07-13 16:30:54
【问题描述】:

我们正在尝试使用我们机器人的 /api/messages 端点将活动直接发送到我们的机器人。我们这样做是为了让我们的机器人有 2 个 Twilio 号码。

首先,我们使用以下代码获取机器人的访问令牌:

var authClient = new HttpClient();
var authRequest = new HttpRequestMessage
{
    Method = HttpMethod.Post,
    RequestUri = new Uri($"https://login.microsoftonline.com/botframework.com/oauth2/v2.0/token"),
    Content = new StringContent($"grant_type=client_credentials&client_id={BOT_MIRCOSOFT_APP_ID}&client_secret={BOT_MICROSOFT_APP_PASSWORD}&scope=https%3A%2F%2Fapi.botframework.com%2F.default", Encoding.UTF8, "application/x-www-form-urlencoded"),
};
var authResponse = await authClient.SendAsync(authRequest).ConfigureAwait(false);

然后,我们将此访问令牌放在我们对机器人的 api 调用的标头中,并通过 /api/messages 端点向机器人发送活动。活动到达机器人并且一切正常,直到我们尝试从机器人发送活动。我们的 AdapterWithErrorHandler 类捕捉到错误消息:Value cannot be null。 (参数'clientSecret')。我们已经彻底搜索,找不到这个 clientSecret 变量在哪里。

我们如何解决此错误,以便我们可以从我们的机器人发送活动?

编辑:这是一个使用未更改的标准回声机器人和控制台应用程序引发此错误的示例项目。要使其正常工作,您需要在控制台应用程序中输入有效的应用程序 ID 和应用程序密码以及回声机器人的设置。 https://github.com/andrew-j-frank/MicrosoftBotErrorSample

编辑:这是错误的堆栈跟踪:

   at Microsoft.IdentityModel.Clients.ActiveDirectory.ClientCredential..ctor(String clientId, String clientSecret)
   at Microsoft.Bot.Connector.Authentication.MicrosoftAppCredentials.<BuildAuthenticator>b__14_0()
   at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode)
   at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor)
   at System.Lazy`1.CreateValue()
   at System.Lazy`1.get_Value()
   at Microsoft.Bot.Connector.Authentication.AppCredentials.<BuildIAuthenticator>b__34_0()
   at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode)
   at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor)
   at System.Lazy`1.CreateValue()
   at System.Lazy`1.get_Value()
   at Microsoft.Bot.Connector.Authentication.AppCredentials.<GetTokenAsync>d__32.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
   at Microsoft.Bot.Connector.Authentication.AppCredentials.<ProcessHttpRequestAsync>d__31.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.Bot.Connector.Conversations.<ReplyToActivityWithHttpMessagesAsync>d__10.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
   at Microsoft.Bot.Connector.ConversationsExtensions.<ReplyToActivityAsync>d__17.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at Microsoft.Bot.Builder.BotFrameworkAdapter.<SendActivitiesAsync>d__34.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.Bot.Builder.TurnContext.<>c__DisplayClass25_0.<<SendActivitiesAsync>g__SendActivitiesThroughAdapter|1>d.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
   at Microsoft.Bot.Builder.TurnContext.<SendActivityAsync>d__24.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at SampleBot.Bots.EchoBot.<OnMessageActivityAsync>d__0.MoveNext() in C:\Users\myuser\source\repos\SampleBot\SampleBot\Bots\EchoBot.cs:line 19
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.ConfiguredTaskAwaitable.ConfiguredTaskAwaiter.GetResult()
   at Microsoft.Bot.Builder.ActivityHandler.<OnTurnAsync>d__0.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.ConfiguredTaskAwaitable.ConfiguredTaskAwaiter.GetResult()
   at Microsoft.Bot.Builder.BotFrameworkAdapter.TenantIdWorkaroundForTeamsMiddleware.<OnTurnAsync>d__0.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.ConfiguredTaskAwaitable.ConfiguredTaskAwaiter.GetResult()
   at Microsoft.Bot.Builder.MiddlewareSet.<ReceiveActivityWithStatusAsync>d__3.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.ConfiguredTaskAwaitable.ConfiguredTaskAwaiter.GetResult()
   at Microsoft.Bot.Builder.BotAdapter.<RunPipelineAsync>d__18.MoveNext()

【问题讨论】:

  • 错误来自哪里?是来自 Microsoft 端点还是 Twilio 端点?
  • 我相信这是微软的端点。我将使用错误的堆栈跟踪更新帖子。
  • (因为这个帖子里还有很多人,如果你想让我看到你的回复,你需要@提及我。)你发这个了吗? github.com/microsoft/botbuilder-dotnet/issues/4266
  • @KyleDelaney 是的,我做到了。抱歉,如果 GitHub 不是问这个问题的正确地方。
  • @AndrewF - 您链接到的 GitHub 存储库缺少大部分文件。例如,没有 csproj 文件,我们无法看到您在此处粘贴的代码在哪里。我想那是你的一个错误。我在那个 repo 中看到的唯一一件事是你正在使用 turn 上下文。无论如何,您是否尝试过 Postman 中的令牌 API 调用以确保它返回您认为的内容?您是否将令牌粘贴到 jwt.ms 以确保它包含所需的所有数据?在任何情况下,Direct Line 都可能在其标题中包含您未包含的内容。

标签: c# botframework


【解决方案1】:

在 Azure Bot 服务中为用户到机器人消息生成不记名令牌的所有代码都是专有的,因此对于如何生成此类令牌并没有真正公开的解释。您当前生成的令牌用于 bot-to-user 消息,我想这就是您的问题所在。因此,您的机器人发送消息所要做的就是生成一个令牌,就像您的频道正在做的那样。

您实际上不需要手动生成令牌,因为 Bot Framework SDK 会为您完成。您可以创建一个连接器客户端,就像我在其他问题的答案中解释的那样,您只需将您的应用 ID 和密码作为凭据传递:Changing the service url for a direct line activity that is sent to our bot

当然,如果您正在构建自己的 API,那么所有这些身份验证都是可选的。如果您不关心验证发送到您的机器人的请求,那么您不需要这样做,如果您不关心验证发送到您的频道的请求,那么您也不需要这样做。或者,您可以提出自己的身份验证方式,而不是使用内置的 AAD 应用注册凭据。

【讨论】:

    猜你喜欢
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 2022-01-08
    • 2019-12-11
    • 1970-01-01
    • 2020-06-30
    相关资源
    最近更新 更多