如何在不输入任何内容的情况下使用C#创建的SDK V4机器人的瀑布对话框中的oauth提示符下修复带有oauth提示的下一步导航?

时间:2019-05-03 11:31:20

标签: c# oauth botframework chatbot

我正在尝试使用OAuthPrompt类中的WaterFallDialog在BOT中实现身份验证,该类包含2个步骤:

  1. 调用OathPrompt(提供登录按钮)以提供凭据
  2. 获取令牌,基于令牌检索成功消息显示,并且用户导航到另一个对话框,否则显示失败消息,

用户重新提示登录

问题:我必须让用户自动将用户导航到步骤2,而在成功验证后无需任何人工干预。

当前情况:我无法执行此操作,因为我必须输入一些内容以使用户导航到步骤#2

问题:仿真器和Webchat频道

语言:C#

Bot SDK:V4

这是我正在尝试基于身份验证构建的新BOT,我正在显示其他选项,即,将用户导航到另一个对话框以执行其他选项。

我已经在STEP#1中尝试使用以下内容:

stepContext.NextAsync()

这是行不通的,我最终不得不输入一些内容来导航,并且更多地给出了异常无效的步骤索引。 我还尝试通过提供与取消标记不兼容的索引号

预期结果:成功使用OAUTH提示进行身份验证后,用户将自动导航到步骤#2 实际结果:在输入任何内容之前无法导航

在下面添加代码:

public class LoginDialog : WaterfallDialog
{
    public LoginDialog(string dialogId, IEnumerable<WaterfallStep> steps = null)
         : base(dialogId, steps)
    {
        AddStep(async (stepContext, cancellationToken) =>
        {
            await stepContext.Context.SendActivityAsync("Please login using below option in order to continue with other options, if already logged in type anything to continue...");

            await stepContext.BeginDialogAsync(EchoWithCounterBot.LoginPromptName, cancellationToken: cancellationToken); // This actually calls the  dialogue of OAuthPrompt whose name is is in EchoWithCounterBot.LoginPromptName.  

            return await stepContext.NextAsync(); // It comes here throws the error as explained above but also i have to type for it to navigate to below step
        });

        AddStep(async (stepContext, cancellationToken) =>
        {
            Tokenresponse = (TokenResponse)stepContext.Result;

            if (Tokenresponse != null)
            {

                await stepContext.Context.SendActivityAsync($"logged in successfully... ");


                return await stepContext.BeginDialogAsync(DisplayOptionsDialog.Id); //Here it goes To another dialogue class where options are displayed
            }
            else
            {
                await stepContext.Context.SendActivityAsync("Login was not successful, Please try again...", cancellationToken: cancellationToken);


                await stepContext.BeginDialogAsync(EchoWithCounterBot.LoginPromptName, cancellationToken: cancellationToken);
            }

            return await stepContext.EndDialogAsync();
        });
    }

    public static new string Id => "LoginDialog";

    public static LoginDialog Instance { get; } = new LoginDialog(Id);
}

1 个答案:

答案 0 :(得分:0)

BeginDialogAsyncPromptAsync应该始终是步骤中的最后一个调用,因此您需要摆脱NextAsyncOAuthPrompt.BeginDialogAsync很特别,因为您不知道它是否会结束转弯。如果已经有可用的令牌,则它将返回该令牌并自动继续调用对话框,这是您的下一步。如果没有可用的令牌,那么它将提示用户登录,这需要在回合结束时进行。显然,在这种情况下,在给用户机会登录之前继续下一步是没有意义的。

除此之外,您的代码应该可以工作。请同时将您的Bot Builder软件包和仿真器都更新到最新版本(Bot Builder当前为4.4.3,仿真器为4.4.0)。登录后,仿真器应自动继续进行下一步,但网络聊天可能会要求用户输入密码。

编辑:如果您使用的Emulator版本无法正确处理自动登录,则可以将Emulator配置为在设置中使用魔术代码代替。

enter image description here