OAuthPrompt Waterfall需要重新启动两次,才能多次调用RouteAsync

时间:2019-07-18 15:38:55

标签: c# .net oauth botframework

我正在尝试使用内置的OAuthPrompt授权用户。我已经将虚拟助手模板与BotBuilder-Samples\samples\csharp_dotnetcore\46.teams-auth结合在一起了,因为我最终将使用我的机器人的Teams频道。我的问题是基于尝试在代码中授权用户的位置而发生的。我尝试过两个地方:

在显示此内容之前,我认为WaterfallDialog是相关的内容。我在46.teams-auth的“瀑布”对话框中减去了两个步骤。

AddDialog(new WaterfallDialog(nameof(WaterfallDialog), new WaterfallStep[]
{
      PromptStepAsync,
      LoginStepAsync,
}));
  1. RouteAsync

    protected override async Task RouteAsync(DialogContext dc, CancellationToken cancellationToken = default(CancellationToken))
    {
        var OAuthResult = await dc.BeginDialogAsync(nameof(WaterfallDialog));
        if (OAuthResult.Result == null)
        {
            await dc.Context.SendActivityAsync(MessageFactory.Text("Please press the Login button."), cancellationToken);
        }
        else
        {
              // ... regular route stuff, like luis check etc
        }
    }
    

这将运行提示,并且我能够登录,但是RouteAsync再也不会被调用。

  1. OnInterruptDialogAsync

    var OAuthResult = await dc.BeginDialogAsync(nameof(WaterfallDialog));
    if (OAuthResult.Result == null)
    {
        await dc.Context.SendActivityAsync(MessageFactory.Text("Please press the Login button."), cancellationToken);
        return InterruptionAction.StartedDialog;
    }
    else
    {
        return InterruptionAction.NoAction;
    }
    

这使我的用户可以登录,然后与RouteAsync方法的LUIS部分进行交互(该方法检查用户是否在每次运行LUIS方法之前均已登录)。这个问题是因为当我在模拟器中启动机器人时,它是在OnInterruptDialogAsync方法中的,因此有两个线程通过此方法运行,并且两次提示用户。我尝试使之dc.BeginDialogAsync(..)仅通过在调用之前检查dc.ActiveDialog是否不是OAuthPrompt才被调用一次,但这只会提示用户一次,然后永远不允许它们登录。

我还尝试在InitialDialogId = nameof(WaterfallDialog)的构造函数中设置MainDialog.cs,但这可以使用户永远不会得到提示。

我们对此提供了任何帮助。我也愿意分享我的项目,但不能在公共场所。谢谢。

1 个答案:

答案 0 :(得分:0)

通过进入bot框架仿真器设置(左下方的齿轮),并在User Settings下确保选中Use a sign-in verification code for OAuthCards,可以解决此问题。