【发布时间】:2020-01-10 09:16:38
【问题描述】:
链接到
此问题链接到我之前的帖子,该帖子与 MS Teams Chanel 中的 MS Bot 框架 oAuth 身份验证问题相关。 OAuth 身份验证已开始工作,但由于建议的代码更改以启用 OAuth 身份验证,因此我面临此问题。
链接的帖子网址: Sign-in button prompts for Credentials and successfully authenticates but, doesn't log-in the user
使用以下 Git Hub 代码示例作为 OAuth 代码的基础并改装到我现有的 ChatBot:https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/csharp_dotnetcore/46.teams-auth
- 问题中提到的类层次结构与上面的代码示例类似。
问题
在我的例子中,MainDialog 类同时使用 LUIS 和自适应卡来驱动对话流。
由于 DialogBot 类中的以下更改,现在 MainDialog .BeginDialogAsync 重写 方法中的 "options" 参数得到 NULL 值,而不是以前在更改之前获得的正确值。
由于 MainDialog .BeginDialogAsync 被覆盖 方法在 "options" 参数中包含用于检测自适应卡返回值的所有代码,现在,它被返回为 null,自适应卡片不起作用。
但是,在 MS Teams 中成功进行 OAuth 身份验证后,LUIS 对话逻辑才起作用。
MainDialog.BeginDialogAsync(DialogContext outerDc, object options = null, CancellationToken cancellationToken = default(CancellationToken)){....}
根据https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/csharp_dotnetcore/46.teams-auth提供的示例oAuth示例代码
- 我从 TeamsActivityHandler 继承了 DialogBot。
在方法TeamsBot.OnTeamsSigninVerifyStateAsync(ITurnContext turnContext, CancellationToken cancelToken)
中实现了建议的代码
-
在重写方法 DialogBot.OnMessageActivityAsync(ITurnContext turnContext, CancellationToken cancelToken) 内部,我将“a”替换为“b”
一个。 await _dialog.Run(turnContext, _botStateService.DialogStateAccessor, cancelToken);
b. await _dialog.RunAsync(turnContext, ConversationState.CreateProperty(nameof(DialogState)), cancelToken);
.Run(....) 到 .RunAsync(....) 的简单更改可能会因为任务“选项”而错过价值并使自适应卡代码不起作用> MainDialog.BeginDialogAsync(..) 方法中的参数值
什么时候起作用
在 DialogBot.OnMessageActivityAsync(...) 中,当我将 b 替换为 c 时,“选项” MainDialog .BeginDialogAsync(...) 中的 参数开始获取使自适应卡代码工作所需的值,但仅当用户已经通过 OAuth 身份验证,即不需要单击登录按钮。(但会引发 “当它不起作用时”部分中提到的另一个问题)
b. await _dialog.RunAsync(turnContext, ConversationState.CreateProperty(nameof(DialogState)), cancelToken);
c。 await _dialog.Run(turnContext, ConversationState.CreateProperty(nameof(DialogState)), cancelToken);
当它不起作用时
在进行“当它工作时”部分中提到的更改后,如果用户键入任何诸如“嗨”之类的话语,它会导致 DialogBot.OnTurnAsync(....)方法。然后每次都会出现此错误,并且无法继续进行 Bot 对话。
- 当用户键入任何话语(即用户尚未签名)时出现异常
- 出现上述异常时的机器人模拟器屏幕截图
问题是什么
在 MS Teams 中的 OAuth 身份验证场景中,我肯定在状态管理方面搞砸了,与应如何处理自适应卡片提交点击(即检索用户提供的值)相协调。
需要输入来处理这种情况,其中 MS Teams OAuth 身份验证涉及聊天机器人,同时满足 LUIS 基于 NLP 的对话和基于 自适应卡 的对话流
更多信息
- 基于自适应卡片和 LUIS 的对话流程运行良好 直到完成上述在 MS Teams 中修复 OAuth 身份验证的更改。
- 我正在使用我的手机热点上网,中间没有代理。
【问题讨论】:
-
你能试试这段代码吗? protected override async Task OnMessageActivityAsync(ITurnContext
turnContext, CancellationToken cancelToken) { // 使用新消息运行对话框 Activity.await Dialog.RunAsync(turnContext , ConversationState.CreateProperty (nameof(DialogState)),cancellationToken); //等待Dialog.Run(turnContext, ConversationState.CreateProperty (nameof(DialogState)),cancellationToken); }" -
发现,当我们在 DiallogBot 类中调用 __ await dialog.RunAsync(....)_ 时,自适应卡片提交是可从 *outerDc.Context.Activity.Value* 获得,而不是公共覆盖中的 options 参数 *Task
BeginDialogAsync* 事件
标签: oauth botframework microsoft-teams adaptive-cards