在我们的网络聊天中,我们启用了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
答案 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页面中的,但它无法自动运行,因此需要如上所述编写代码行