使用BotAuth对话框在Webchat上启用语音

时间:2018-10-12 14:35:24

标签: botframework

在我们的网络聊天中,我们启用了BotAuth,以便用户应该能够使用Azure AD凭据登录(如下所示):

await context.Forward(new AuthDialog(new MSALAuthProvider(), options), async (IDialogContext authContext, IAwaitable<AuthResult> authResult) =>
{
    aresult = await authResult;
    ....
}

要启用语音,我们正在使用Directline客户端,如此处所述 https://docs.microsoft.com/en-us/azure/bot-service/bot-service-channel-connect-webchat-speech

Bot首次显示“登录”按钮,并且用户能够登录,并且可以看到电子邮件已发送到其ID。

第二次,如果另一个用户登录,则不显示登录按钮,而是显示电子邮件已发送给第一用户,从而以某种方式保留了第二用户的第一用户令牌,依此类推。

如果我们删除Webchat.html的引用(其中包含对Bot的直接引用,则该功能可以正常工作)。似乎Directline保留了令牌,这会导致上述问题。

为清除直线消息,我们尝试了these options,但没有获得确切的解决方案

关于如何解决此问题的任何想法?,还在此处发布了问题 https://github.com/Microsoft/BotFramework-WebChat/issues/1208

2 个答案:

答案 0 :(得分:1)

DirectLine没有保留令牌,您的机器人是BotAuth代码,或更具体地说,是BotAuth代码。 BotAuth将三个值存储在BotUserData存储中。 AuthResultKey,MagicNumberKey和MagicNumberValidated。它使用这些来获取和刷新身份验证令牌。看看MSALAuthProvier.cs是BotAuth项目,看看我在说什么。

BothAuth将令牌存储在内存缓存中,然后只要认为同一用户仍在“登录”,就检索或刷新令牌。您需要做的是在您的漫游器中提出一种注销当前用户的机制。

无论您决定采用哪种机制执行注销,都只需清除BotUserData存储中存储的三段数据。您可以在BotAuth项目的AuthDialog.cs中的登录过程中查看BotAuth在哪里设置这些值。

在我从事的多个机器人项目中,我实现了直接注销,在此我提示用户并询问他们是否已完成并想注销。我还跟踪用户收到的最后一条消息的时间戳。我有一个超时值(通常是五分钟左右),如果下一个五分钟的间隔后出现下一条消息,我会静默执行注销(通过清除我提到的那些值),从而强制进行新的登录。 这是我正在谈论的一个简单示例。这是我的MessagesController.cs

var userPrivateData = await _botDataStore.LoadAsync(key, BotStoreType.BotUserData, CancellationToken.None);

if (!DateTime.TryParse(userPrivateData.GetProperty<string>(Utility.Constants.UserActivityKey), out DateTime userLastActivity))
userLastActivity = DateTime.Now;
Trace.TraceInformation($"MessagesController::User Last Activity : {userLastActivity.ToString()}");

TimeSpan sincelast = TimeSpan.FromTicks(DateTime.Now.Ticks - userLastActivity.Ticks);
if (sincelast > Constants.MaxIdleTimeTicks)
{
    Trace.TraceInformation($"MessagesController::User Last Activity : Idle Timeout. Reset User Auth State");        

    userPrivateData.RemoveProperty($"{Constants.AzureADAuthType}{ContextConstants.AuthResultKey}");
    userPrivateData.RemoveProperty($"{Constants.AzureADAuthType}{ContextConstants.MagicNumberKey}");
    userPrivateData.RemoveProperty($"{Constants.AzureADAuthType}{ContextConstants.MagicNumberValidated}");
}
userPrivateData.SetProperty(Utility.Constants.UserActivityKey, DateTime.Now.ToString());

await _botDataStore.SaveAsync(key, BotStoreType.BotUserData, userPrivateData, CancellationToken.None);
await _botDataStore.FlushAsync(key, CancellationToken.None);

答案 1 :(得分:0)

感谢您的回复,它为我指明了正确的方向,

StartAsync方法中的

context.userdata.clear()..单个语句解决了此问题

基本上,我很惊讶在此url中如何处理它 https://webchat.botframework.com/embed/botname?s=“秘密”

但是,虽然它是通过Directlinewebchat.html引用集成到html页面中的,但它无法自动运行,因此需要如上所述编写代码行