我正在尝试使用OAuthPrompt
类中的WaterFallDialog
在BOT中实现身份验证,该类包含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);
}
答案 0 :(得分:0)
BeginDialogAsync
或PromptAsync
应该始终是步骤中的最后一个调用,因此您需要摆脱NextAsync
。 OAuthPrompt.BeginDialogAsync
很特别,因为您不知道它是否会结束转弯。如果已经有可用的令牌,则它将返回该令牌并自动继续调用对话框,这是您的下一步。如果没有可用的令牌,那么它将提示用户登录,这需要在回合结束时进行。显然,在这种情况下,在给用户机会登录之前继续下一步是没有意义的。
除此之外,您的代码应该可以工作。请同时将您的Bot Builder软件包和仿真器都更新到最新版本(Bot Builder当前为4.4.3,仿真器为4.4.0)。登录后,仿真器应自动继续进行下一步,但网络聊天可能会要求用户输入密码。
编辑:如果您使用的Emulator版本无法正确处理自动登录,则可以将Emulator配置为在设置中使用魔术代码代替。