Значение не может быть нулевым. (Параметр clientSecret) при отправке активности от бота - PullRequest
0 голосов
/ 13 июля 2020

Мы пытаемся отправить действие непосредственно нашему боту, используя конечную точку / 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 / конечная точка сообщений. Активность достигает бота, и все работает, пока мы не попытаемся отправить активность от бота. Наш класс AdapterWithErrorHandler обнаруживает ошибку с сообщением: Значение не может быть нулевым. (Параметр clientSecret). Мы тщательно искали и не смогли найти, где находится эта переменная clientSecret. Как мы можем устранить эту ошибку, чтобы мы могли отправлять действия от нашего бота?

Изменить: вот пример проекта, который выдает эту ошибку с использованием неизмененного стандартного эхо-бота и консольного приложения. Чтобы заставить его работать, вам нужно ввести действительный идентификатор приложения и пароль приложения в консольном приложении и в настройках эхо-бота. 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()

1 Ответ

0 голосов
/ 18 июля 2020

Весь код, который генерирует токены-носители для сообщений между пользователем и ботом в Azure Bot Service, является проприетарным, поэтому на самом деле нет публичного объяснения того, как сгенерировать такой токен. Токен, который вы в настоящее время генерируете, предназначен для сообщений от ботов к пользователям, и я думаю, что в любом случае ваш вопрос именно об этом. Таким образом, все, что ваш бот должен сделать для отправки сообщений, - это сгенерировать токен, как это делает ваш канал.

На самом деле вам не нужно создавать токен вручную, так как SDK Bot Framework сделает это за вас. Вы можете создать клиент коннектора, как я объяснил в ответе на другой ваш вопрос, и вы просто передадите свой идентификатор приложения и пароль в качестве учетных данных: Изменение URL-адреса службы для прямой линии, которая отправляется нашему боту

Конечно, вся эта аутентификация в любом случае необязательна, если вы создаете свой собственный API. Если вас не волнует аутентификация запросов, отправленных вашему боту, вам не нужно этого делать, и если вас не волнует аутентификация запросов, отправленных на ваш канал, вам тоже не нужно этого делать. В качестве альтернативы вы можете придумать свои собственные средства аутентификации, а не использовать встроенные регистрационные данные приложения AAD.

...