Аутентификация команд Microsoft: невозможно получить токен в боте команд (V4 SDK) - PullRequest
1 голос
/ 13 мая 2019

У меня есть бот Microsoft Teams , и я пытаюсь аутентифицировать пользователя, используя AAD (конечная точка v2) . Бот использует V4 SDK и OauthPrompt . Я могу войти, но не могу получить токен.

Я использую OAuth Card. Карта обрабатывается внутри Команд. Когда нажата кнопка входа, она переходит на страницу входа Microsoft. После входа пользователя бот перестает отвечать, и поэтому у меня нет возможности получить токен.

Образцы, которые я пробую: https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/csharp_dotnetcore/18.bot-authentication а также https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/csharp_dotnetcore/24.bot-authentication-msgraph.

Оба образца работают внутри эмулятора.

Вот фрагмент кода:

               AddDialog(new OAuthPrompt(
            nameof(OAuthPrompt),
            new OAuthPromptSettings
            {
                ConnectionName = ConnectionName,
                Text = "Please Sign In",
                Title = "Sign In",
                Timeout = 300000, // User has 5 minutes to login (1000 * 60 * 5)
            }));


         AddDialog(new ConfirmPrompt(nameof(ConfirmPrompt)));

        AddDialog(new WaterfallDialog(nameof(WaterfallDialog), new WaterfallStep[]
        {
            PromptStepAsync,
            LoginStepAsync,
            DisplayTokenPhase1Async,
            DisplayTokenPhase2Async,
        }));

 private async Task<DialogTurnResult> PromptStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
           return await stepContext.BeginDialogAsync(nameof(OAuthPrompt), null, cancellationToken);
        }


Он никогда не достигает кода:

        private async Task<DialogTurnResult> LoginStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
    {
        // Get the token from the previous step. Note that we could also have gotten the
        // token directly from the prompt itself. There is an example of this in the next method.
        var tokenResponse = (TokenResponse)stepContext.Result;
        if (tokenResponse != null)
        {
            await stepContext.Context.SendActivityAsync(MessageFactory.Text("You are now logged in."), cancellationToken);
            return await stepContext.PromptAsync(nameof(ConfirmPrompt), new PromptOptions { Prompt = MessageFactory.Text("Would you like to view your token?") }, cancellationToken);
        }

        await stepContext.Context.SendActivityAsync(MessageFactory.Text("Login was not successful please try again."), cancellationToken);
        return await stepContext.EndDialogAsync(cancellationToken: cancellationToken);
    }

Я ожидал, что токен будет получен в коде, как только пользователь войдет в систему, но бот просто перестает отвечать.

Ответы [ 2 ]

2 голосов
/ 29 мая 2019

Кажется, что это ошибка в среде ботов, но уже есть запрос на удаление, чтобы решить эту проблему.Вы можете найти запрос на получение здесь .

Редактировать: Они отредактировали оба образца аутентификации, чтобы исправить эту проблему прямо сейчас, как вы можете видеть здесь .

0 голосов
/ 30 мая 2019

Вот так у меня все получилось.

public override async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
    {

        await base.OnTurnAsync(turnContext, cancellationToken);

        // Save any state changes that might have occured during the turn.
        await ConversationState.SaveChangesAsync(turnContext, false, cancellationToken);
        await UserState.SaveChangesAsync(turnContext, false, cancellationToken);

           if (turnContext.Activity.Name == "signin/verifyState")
            {

                await Dialog.Run(turnContext, ConversationState.CreateProperty<DialogState>(nameof(DialogState)), cancellationToken);

            }

      }

Затем он переходит к шагу LoginStepAsync Водопада.

...