我正在尝试使用内置的OAuthPrompt授权用户。我已经将虚拟助手模板与BotBuilder-Samples\samples\csharp_dotnetcore\46.teams-auth
结合在一起了,因为我最终将使用我的机器人的Teams频道。我的问题是基于尝试在代码中授权用户的位置而发生的。我尝试过两个地方:
在显示此内容之前,我认为WaterfallDialog
是相关的内容。我在46.teams-auth的“瀑布”对话框中减去了两个步骤。
AddDialog(new WaterfallDialog(nameof(WaterfallDialog), new WaterfallStep[]
{
PromptStepAsync,
LoginStepAsync,
}));
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再也不会被调用。
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
,但这可以使用户永远不会得到提示。
我们对此提供了任何帮助。我也愿意分享我的项目,但不能在公共场所。谢谢。
答案 0 :(得分:0)
通过进入bot框架仿真器设置(左下方的齿轮),并在User Settings
下确保选中Use a sign-in verification code for OAuthCards
,可以解决此问题。