«BotAuthenticator не смог аутентифицировать входящий запрос!» ошибка в Teams при использовании бота

Я создал приложение Bot в Visual Studio 2017, которое хочу использовать в MS Teams. Это приложение является частью решения, которое содержит 2 компонента: само приложение-бот и приложение для Windows, которое я создал, которое используется приложением-ботом для получения токена аутентификации от Microsoft (с использованием кода, аналогичного тому, что есть на этом веб-сайте. https://docs.microsoft.com/en-us/azure/active-directory/develop/guidedsetups/active-directory-uwp-v2).

При отладке бота после его локального размещения я могу успешно использовать бота в Teams. Ошибки нет. Однако теперь, когда я зарегистрировал бота в Microsoft Bot Framework в Azure, у меня возникли проблемы, поскольку Teams возвращает сообщение «Извините, у моего кода бота возникла проблема». В Azure у меня есть объект регистрации каналов ботов, который в своих настройках указывает на конечную точку обмена сообщениями https: //.azurewebsites.net/api/messages. У меня также есть Служба приложений. Теперь я передал идентификатор приложения, который я получил при регистрации бота в Microsoft Bot Framework, и поместил его в приложение бота в Visual Studio в файле web.config вместе с паролем приложения.

После тестирования этого в эмуляторе Bot Framework я получаю «POST 401 directline.postActivity», а в «Inspector-JSON» я получаю «BotAuthenticator не удалось аутентифицировать входящий запрос!». Это мое первое приложение-бот, поэтому я не понимаю, что я потенциально упустил, так что кто-нибудь знает, что я могу попробовать?


Итак, вот что у меня есть в моем файле RootDialog.cs, куда конечная точка попадет при использовании бота.

private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<object> result)
{
            var activity = await result as Activity;
            string userInfo = "";
            AuthTokenDeploy tokenDeploy = new AuthTokenDeploy();
            userInfo = await tokenDeploy.MsGraphUserInfo();
            if (!userInfo.Equals(""))
            {
                // send webhook to end user system
                await SendToEndpoint(context, activity, activity.Text, 
                userInfo);
            }
}

AuthTokenDeploy - это экземпляр другого класса, в котором хранится функция для получения токена доступа вместе с пользовательской информацией от Microsoft. Итак, я создал строку «userInfo», которая затем принимает значение, указанное MsGraphUserInfo ().

public async Task<string> MsGraphUserInfo()
        {
            AuthenticationResult authResult = null;
            string Text = null;

            try
            {
                authResult = await App.PublicClientApp.AcquireTokenSilentAsync(_scopes, App.PublicClientApp.Users.FirstOrDefault());
            }
            catch (MsalUiRequiredException ex)
            {
                // A MsalUiRequiredException happened on AcquireTokenSilentAsync. This indicates you need to call AcquireTokenAsync to acquire a token
                System.Diagnostics.Debug.WriteLine($"MsalUiRequiredException: {ex.Message}");

                try
                {
                    authResult = await App.PublicClientApp.AcquireTokenAsync(_scopes);
                }
                catch (MsalException msalex)
                {

                }
            }
            catch (Exception ex)
            {

            }

            if (authResult != null)
            {
                Text = await GetHttpContentWithToken(_graphAPIEndpoint, authResult.AccessToken);
            }

            return Text;
        }

Вызов MsGraphUserInfo () откроет «AuthToken.exe» как всплывающее окно и попросит пользователя войти в систему со своими учетными данными. Из приведенного выше кода видно, что сначала он получает токен доступа, который затем передается в GetHttpContentWithToken (), где выполняется HTTP-запрос GET для «https://graph.microsoft.com/v1.0/me», и возвращается строка JSON с информацией о пользователе в нем.

public async Task<string> GetHttpContentWithToken(string url, string token)
        {
            var httpClient = new System.Net.Http.HttpClient();
            System.Net.Http.HttpResponseMessage response;
            try
            {
                var request = new System.Net.Http.HttpRequestMessage(System.Net.Http.HttpMethod.Get, url);
                //Add the token in Authorization header
                request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
                response = await httpClient.SendAsync(request);
                var content = await response.Content.ReadAsStringAsync();
                return content;
            }
            catch (Exception ex)
            {
                return ex.ToString();
            }
        }

Теперь я чувствую, что этот метод использования приложения Windows, позволяющий пользователю войти в систему, может быть не лучшим способом продвижения вперед, поэтому я читал и следовал этому руководству https://docs.microsoft.com/en-us/azure/app-service/app-service-web-tutorial-auth-aad. Я хотел бы знать, можно ли использовать то, что находится на этой странице, чтобы мой бот мог получить токен доступа?

Вы упоминаете app.config. Вы имеете в виду web.config? MicrosoftAppId и MicrosoftAppPassword должны быть в файле web.config или в параметрах приложения Azure.

Eric Dahlvang 25.07.2018 21:55

Ага, извините, я обновил текст, так как это файл web.config, а не app.config

Pradeep Patel 26.07.2018 10:43
contains 2 components, the bot application itself and a windows application, which I have created that is used by the bot application to retrieve an authentication token from Microsoft Я хотел бы знать, где вы устанавливаете / размещаете это приложение Windows?
Fei Han 26.07.2018 11:00

Он размещен в Azure в подпапке (корзине), в которой находятся файлы бота. Из того, что я вижу, здесь есть 3 файла, связанные с этим приложением Windows, а именно: «AuthToken.exe», «AuthToken.exe.config» и «AuthToken.pdb».

Pradeep Patel 26.07.2018 11:05

Попробуйте выполнить отладку локально, чтобы узнать, можете ли вы получить дополнительную информацию об ошибке: blog.botframework.com/2017/10/19/… (не с эмулятором, а с каналом MS Teams)

Eric Dahlvang 26.07.2018 22:56

Я попробовал это снова, используя ngrok и следуя процедуре в этой ссылке, но, похоже, он все еще работает нормально при локальном тестировании. Теперь у меня есть подозрение, что это может быть связано с тем, где находится файл Authtoken.exe и его компоненты в Azure. Локально они размещаются в собственной папке bin подкаталогов, откуда проект Bot берет исполняемый файл. Однако, когда решение размещено в Azure, кажется, что все находится в одной папке bin, и поэтому я предполагаю, что проект Bot может искать «Authtoken.exe» не в том месте.

Pradeep Patel 30.07.2018 18:32
I'm assuming the Bot project might be looking in the wrong place for the "Authtoken.exe" Не могли бы вы поделиться соответствующим кодом для связи с этим приложением Windows и получения токена аутентификации из вашего бота-приложения?
Fei Han 01.08.2018 09:31

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

Pradeep Patel 01.08.2018 15:49
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
8
548
0

Другие вопросы по теме