MS Bot Framework не запоминает аутентификацию - PullRequest
0 голосов
/ 03 мая 2019

Я разрабатываю MS Bot с фреймворком v4 и пытаюсь настроить аутентификацию. Проблема в том, что я могу аутентифицироваться, но если я хочу восстановить маркер аутентификации пользователя, перекомпоновав диалоговое окно (найдено здесь ), тогда я получаю новый логин-запрос вместо простого извлечения токена.

Вот что попробовал:

  • с использованием Azure AD v1 и v2
  • поиск документации (но она устарела или совпадает с найденной по ссылке)

Мой код (если вам нужно что-то еще, не стесняйтесь спрашивать):

// Register the Promt
AddDialog(Prompt(ConnectionName));

// Prompts the user to log in using the OAuth provider specified by the connection name.
// Prompt definition
public static OAuthPrompt Prompt(string connectionName) => new OAuthPrompt(
       LoginPromptName,
       new OAuthPromptSettings
       {
           ConnectionName = connectionName,
           Text = "Please login",
           Title = "Login",
           Timeout = 300000, // User has 5 minutes to login
       });

private async Task<DialogTurnResult> PromptStepAsync(WaterfallStepContext context, CancellationToken cancellationToken)
{
    var state = await UserProfileAccessor.GetAsync(context.Context);
    return await context.BeginDialogAsync(LoginPromptName, cancellationToken: cancellationToken);
}

private async Task<DialogTurnResult> LoginStepAsync(WaterfallStepContext context, CancellationToken cancellationToken)
{
    var loginState = await UserProfileAccessor.GetAsync(context.Context);
    // 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)context.Result;
    if (tokenResponse != null)
    {
       * DOES SOMETHING WHEN LOGGED IN*
    }
    else
    {
       * DOES SOMETHING WHEN LOGIN FAILED *
    }


    /* !! 
       HERE IS THE PROBLEM IN STEAD OF CHECKING IF THE USER 
       IS ALREADY LOGGED IN AND JUST RETRIEVING THE TOKEN I
       GET A NEW LOGIN SCREEN.
       !!
    */
    var token2Response = await context.BeginDialogAsync(LoginPromptName, null, cancellationToken)


}

Таким образом, в основном я хочу получить токен пользователя, чтобы в различных методах и диалоговых окнах проверять, вошел ли пользователь в систему.

1 Ответ

1 голос
/ 03 мая 2019

Это связано с этой ошибкой: OAuthPrompt требует учетные данные пользователя, когда сообщение содержит идентификатор guid или 6-значный номер , для которого в настоящее время Запрос на извлечение исправляется.

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

return await stepContext.PromptAsync(nameof(ConfirmPrompt), new PromptOptions { Prompt = MessageFactory.Text("Would you like to view your token?") }, cancellationToken);

Я протестировал добавление этого к вашему коду в * DOES SOMETHING WHEN LOGGED IN*, и это сработало:

enter image description here

...