Я создал приложение 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. Я хотел бы знать, можно ли использовать то, что находится на этой странице, чтобы мой бот мог получить токен доступа?
Ага, извините, я обновил текст, так как это файл web.config, а не app.config
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?
Он размещен в Azure в подпапке (корзине), в которой находятся файлы бота. Из того, что я вижу, здесь есть 3 файла, связанные с этим приложением Windows, а именно: «AuthToken.exe», «AuthToken.exe.config» и «AuthToken.pdb».
Попробуйте выполнить отладку локально, чтобы узнать, можете ли вы получить дополнительную информацию об ошибке: blog.botframework.com/2017/10/19/… (не с эмулятором, а с каналом MS Teams)
Я попробовал это снова, используя ngrok и следуя процедуре в этой ссылке, но, похоже, он все еще работает нормально при локальном тестировании. Теперь у меня есть подозрение, что это может быть связано с тем, где находится файл Authtoken.exe и его компоненты в Azure. Локально они размещаются в собственной папке bin подкаталогов, откуда проект Bot берет исполняемый файл. Однако, когда решение размещено в Azure, кажется, что все находится в одной папке bin, и поэтому я предполагаю, что проект Bot может искать «Authtoken.exe» не в том месте.
I'm assuming the Bot project might be looking in the wrong place for the "Authtoken.exe"
Не могли бы вы поделиться соответствующим кодом для связи с этим приложением Windows и получения токена аутентификации из вашего бота-приложения?
Я обновил свой исходный вопрос, включив в него код, а также еще один потенциальный способ решения этой проблемы, который может быть лучшим способом продвижения вперед без необходимости использования приложения Windows для выполнения этого бита аутентификации.
Вы упоминаете app.config. Вы имеете в виду web.config? MicrosoftAppId и MicrosoftAppPassword должны быть в файле web.config или в параметрах приложения Azure.