Team bot中身份验证的问题:如何强制打开选项卡?

时间:2019-06-06 15:41:00

标签: authentication botframework microsoft-teams

我们开发了一个基于Virtual Assistant Solution Accelerator beta 0.3的机器人。 机器人是通过Teams消耗的,而且都是天蓝色的。 我们正在通过该机器人使用其他服务:office365和Yammer。用户根据虚拟助手代码通过OAuthPrompt进行身份验证。 直到最近,一切都还不错。但是我们在星期二早上发现,对于尚未登录的用户来说存在一个问题。

在身份验证过程中,单击oauthprompt卡中的登录按钮时,它将打开一个新选项卡,连接用户并显示魔术代码。但是现在,此选项卡在显示代码后立即关闭,从而防止用户将其复制到团队中。

如果我们紧接着重新打开选项卡,则代码在这里并且可以正常工作。 我们使用chrome,Firefox和edge进行了测试,结果相同。但是在移动设备上,该选项卡保持打开状态。我们通过Team App和Team Web App进行了测试。

我现在的问题是:当通过团队中的卡片打开动作时,我是否可以保持选项卡打开(动作类型为openUrl)。

1 个答案:

答案 0 :(得分:0)

这可能与this issue有关,特别是您的操作类型现在为openUrl时为Signin

您是否正在使用中间件以使其开始工作?中间件看起来像:

// hook up onSend pipeline
turnContext.OnSendActivities(async (ctx, activities, nextSend) =>
{
    foreach (var activity in activities)
    {
        if (activity.ChannelId != "msteams") continue;
        if (activity.Attachments == null) continue;
        if (!activity.Attachments.Any()) continue;
        if (activity.Attachments[0].ContentType != "application/vnd.microsoft.card.signin") continue;
        if (!(activity.Attachments[0].Content is SigninCard card)) continue;
        if (!(card.Buttons is CardAction[] buttons)) continue;
        if (!buttons.Any()) continue;

        // Modify button type to openUrl as signIn is not working in teams
        buttons[0].Type = ActionTypes.OpenUrl;
    }

    // run full pipeline
    return await nextSend().ConfigureAwait(false);
});

最近进行了更新,因此您不再需要中间件。而是,请按照下列步骤操作:

  1. 下载最新样本
  2. 在App Studio清单编辑器中创建团队机器人
  3. 在“域和权限”下,确保已将token.botframework.com添加为有效域。
    • (可选)使用您的appId和https://token.botframework.com/.auth/web/redirect启用Web应用程序单点登录
  4. 点击“安装”并开始与您的机器人对话

如果您已经对机器人进行了大量工作,并且不想使用新的示例,请将所有软件包更新为4.4.4,我相信您可以将其添加到{{1} }:

OnTurnAsync()

如果这不起作用,您可以尝试使用此方法:

if (turnContext?.Activity?.Type == ActivityTypes.Invoke && turnContext.Activity.ChannelId == "msteams")
    await Dialog.Run(turnContext, ConversationState.CreateProperty<DialogState>(nameof(DialogState)), cancellationToken);
else
    await base.OnTurnAsync(turnContext, cancellationToken);

中间件做到了这一点,因此Teams中的牌使用protected override async Task OnUnrecognizedActivityTypeAsync(ITurnContext turnContext, CancellationToken cancellationToken) { if (turnContext?.Activity.Type == ActivityTypes.Invoke) { await turnContext.SendActivityAsync( new Activity() { Type = ActivityTypesEx.InvokeResponse, Value = null }); await Dialog.Run(turnContext, ConversationState.CreateProperty<DialogState>(nameof(DialogState)), cancellationToken); } } (不再起作用)而不是Action.OpenUrl(其他渠道使用)。


对于每个@SylvainBarbot,您可能还需要更新软件包,如this issue

中所述